2017-03-14 1 views
1

AWS S3에서 제거하고자하는 12 개의 버킷이 있습니다. 모두 비슷한 이름을 가지며 bucket-to-remove 및 일부 객체가 포함되어 있습니다.한 번에 여러 S3 버킷을 제거하는 방법?

UI를 사용하는 것이 매우 느리므로 CLI를 사용하여 이러한 모든 버킷을 빠르게 제거 할 수있는 솔루션이 있습니까?

답변

1

boto3을 사용하면 객체가있는 버킷을 삭제할 수 없으므로 먼저 버킷을 삭제하기 전에 객체를 제거해야합니다. 에 따르면

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

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 명령은 버킷 내부의 모든 개체를 반복적으로 삭제하기 때문에 실행하는 데 약간의 시간이 걸립니다.

0

한 번에 모두 삭제하려면이 샘플 라인을 사용해보십시오. 이것은 매우 파괴적이라는 것을 기억하십시오. 당신이하고있는 것을 당신이 알고 있기를 바랍니다.

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

이것으로 끝났습니다. 버킷 양과 내용에 따라 시간이 좀 걸릴 수 있습니다.

관련 문제