如何一次删除多个S3存储桶?

时间:2017-03-14 08:02:05

标签: amazon-s3

我想在AWS S3中删除十几个存储桶,它们都有一个类似的名称,包含bucket-to-remove并且包含一些对象。

使用UI非常慢,是否有使用CLI快速删除所有这些存储桶的解决方案?

6 个答案:

答案 0 :(得分:7)

您可以尝试此示例行一次删除所有内容。请记住,这是非常具有破坏性的,所以我希望你知道你在做什么:

for bucket in $(aws s3 ls | awk '{print $3}' | grep my-bucket-pattern); do  aws s3 rb "s3://${bucket}" --force ; done

你已经完成了。可能需要一段时间,具体取决于存储桶的数量及其内容。

答案 1 :(得分:3)

使用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)

答案 2 :(得分:0)

根据pp,只有当存储桶没有启用版本控制时,才能使用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命令需要一段时间才能运行,因为它会递归删除存储桶中的所有对象。

答案 3 :(得分:0)

批量删除S3存储桶的最简单方法是不写任何代码。我使用Cyberduck来浏览我的S3帐户并轻松删除存储桶及其内容。

答案 4 :(得分:0)

我做到了

aws s3api list-buckets \
   --query 'Buckets[?starts_with(Name, `bucket-pattern `) == `true`].[Name]' \
   --output text | xargs -I {} aws s3 rb s3://{} --force

然后根据需要更新存储区模式。

但是请小心,这是一个非常危险的操作。

答案 5 :(得分:0)

这是Windows解决方案

for /f "tokens=3" %a in ('aws s3 ls ^| findstr "<search here>"') do aws s3 rb s3://%a --force

请在删除之前测试过滤器!