我有一打我想在AWS S3中删除的桶,所有桶都有一个类似的名称,其中包含bucket-to-remove
以及其中的一些对象。如何一次删除多个S3存储桶?
使用用户界面非常慢,是否有解决方案可以使用CLI快速删除所有这些存储桶?
我有一打我想在AWS S3中删除的桶,所有桶都有一个类似的名称,其中包含bucket-to-remove
以及其中的一些对象。如何一次删除多个S3存储桶?
使用用户界面非常慢,是否有解决方案可以使用CLI快速删除所有这些存储桶?
使用boto3您不能删除其中有对象的存储桶,因此您首先需要在删除存储桶之前删除这些对象。最简单的解决方案是一个简单的Python脚本,例如:
import boto3
import botocore
import json
s3_client = boto3.client(
"s3",
aws_access_key_id="<your key id>",
aws_secret_access_key="<your secret access key>"
)
response = s3_client.list_buckets()
for bucket in response["Buckets"]:
# Only removes the buckets with the name you want.
if "bucket-to-remove" in bucket["Name"]:
s3_objects = s3_client.list_objects_v2(Bucket=bucket["Name"])
# Deletes the objects in the bucket before deleting the bucket.
if "Contents" in s3_objects:
for s3_obj in s3_objects["Contents"]:
rm_obj = s3_client.delete_object(
Bucket=bucket["Name"], Key=s3_obj["Key"])
print(rm_obj)
rm_bucket = s3_client.delete_bucket(Bucket=bucket["Name"])
print(rm_bucket)
按照S3 docs你可以只使用如果桶不具有版本控制启用CLI命令aws s3 rb
删除桶。如果是这样的话,你可以写一个简单的bash脚本来获取桶的名称和一个删除一个,如:
#!/bin/bash
# get buckets list => returns the timestamp + bucket name separated by lines
S3LS="$(aws s3 ls | grep 'bucket-name-pattern')"
# split the lines into an array. @see https://stackoverflow.com/a/13196466/6569593
oldIFS="$IFS"
IFS='
'
IFS=${IFS:0:1}
lines=($S3LS)
IFS="$oldIFS"
for line in "${lines[@]}"
do
BUCKET_NAME=${line:20:${#line}} # remove timestamp
aws s3 rb "s3://${BUCKET_NAME}" --force
done
小心不要删除重要的桶!我建议在实际删除它们之前输出每个存储桶的名称。另请注意,aws s3 rb
命令需要一段时间才能运行,因为它会递归删除存储桶中的所有对象。
你可以尝试这个示例行来一次删除所有。请记住,这是高度破坏性的,所以我希望你知道你在做什么:
for bucket in $(aws s3 ls | awk '{print $3}' | grep my-bucket-pattern); do aws s3 rb "s3://${bucket}" --force ; done
你完成了。可能需要一段时间,取决于桶的数量和内容。
你只是回答你自己的问题错误。您不需要删除对象以删除存储桶!您只需在S3中创建不需要的I/O。 – mootmoot
boto3不是AWS CLI! – mootmoot
我建议你在传播谎言之前先阅读[doc](http://botocore.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.delete_bucket)。清楚地表明,必须删除存储区中的所有对象(包括所有对象版本和删除标记),然后才能删除存储区本身。 –