2017-03-14 17 views

答えて

1

boto3を使用すると、オブジェクトが含まれているバケットを削除することはできません。まず、バケットを削除する前にオブジェクトを削除する必要があります。あなたはバケットが有効になってバージョニングていない場合にのみ、CLIコマンドaws s3 rbを使用してバケットを削除することができS3 docsによると

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) 
+0

あなた自身の質問に間違いなく答えるだけです。バケツを削除するためにオブジェクトを削除する必要はありません! S3で不要なI/Oを作成するだけです。 – mootmoot

+0

boto3はAWS CLIではありません! – mootmoot

+1

あなたのコメントに嘘を広げる前に[doc](http://botocore.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.delete_bucket)を読むことをお勧めします。バケット内のすべてのオブジェクト(すべてのオブジェクトバージョンと削除マーカーを含む)は、バケット自体を削除する前に削除する必要があります。 –

0

:最も簡単な解決策は、以下のような簡単なPythonスクリプトです。その場合は、あなたはバケツ名を取得し、それらを一つずつ削除するには、簡単な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コマンドは、バケット内のすべてのオブジェクトを再帰的に削除するため、実行に時間がかかることにも注意してください。

0

すべてを一度に削除するには、このサンプル行を試してください。これは非常に破壊的であることを忘れないでください、私はあなたが何をしているか知っている願っています:

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

あなたはそれで行われます。バケツの量と内容に応じてしばらく時間がかかることがあります。

関連する問題