S3のバケットを削除する場合、まずバケットを空にする必要があります。ここではAWS CLIを利用しバケットを空にし、その後にバケットを削除する手順を記載します。
具体的には list-object-versionsでオブジェクトをリストアップし、delete-objectでオブジェクトを一つづつ削除します。なお記載する例は、バケットの中のオブジェクトが1000個未満の場合に利用できます。(list-object-versionsの1回の実行でリストされるオブジェクトの最大個数がデフォルトでは1000のため*1 )
ちなみにaws s3 rm s3://バケット名 --recursive
やaws s3 rb s3://バケット名 --force
で最初試しましたが、バージョニングが有効な場合これらのコマンドでは削除マーク
が付くだけですし、バージョニングされた古いオブジェクトは何もされず、オブジェクトが消えないため、このようなやり方をする必要がありました。(ユーザーガイド*2にもバージョニングが有効で無い場合に限ってと注釈がありますね )
削除手順
変数設定
PROFILE="<AWS CLIのプロファイルを指定する。デフォルトの場合はdefault>" BUCKET_NAME="<対象のバケット名を設定する>"
バケットを空にする
# 削除マーカーがついているオブジェクトの削除 aws --profile ${PROFILE} --output text \ s3api list-object-versions \ --bucket ${BUCKET_NAME} \ --query 'DeleteMarkers[].{Key:Key,VersionId:VersionId}' | while read key versionid do aws --profile ${PROFILE} \ s3api delete-object \ --bucket ${BUCKET_NAME} \ --key ${key} \ --version-id ${versionid} done # それ以外のオブジェクトの削除 aws --profile ${PROFILE} --output text \ s3api list-object-versions \ --bucket ${BUCKET_NAME} \ --query 'Versions[].{Key:Key,VersionId:VersionId}' | while read key versionid do aws --profile ${PROFILE} \ s3api delete-object \ --bucket ${BUCKET_NAME} \ --key ${key} \ --version-id ${versionid} done
バケットの削除
aws --profile ${PROFILE} \ s3api delete-bucket \ --bucket "${BUCKET_NAME}"