Amazon S3でバケットを削除するには、バケットの中身を空にする必要があります。
ですが、バージョニングを有効にしたバケットの場合は、単純にオブジェクトを削除するだけではなく、全バージョンのオブジェクトを削除する必要があります。
$ aws s3api delete-bucket --bucket [your-bucket-name]
An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: The bucket you tried to delete is not empty. You must delete all versions in the bucket.
本当にずっと持っていたいバケットなら困らないんですけど、テスト目的で作ったバケットとかだと削除したい場合に面倒になります…。
で、aws s3api list-object-versions --bucket [your-bucket-name]
でバケット内にあるオブジェクトのバージョンが取得できるようなので、これを利用してPerl One Linerを書いてみました。
## [your-bucket-name]が 2箇所 にあるので、バケット名に置き換えてください
$ aws s3api list-object-versions --bucket [your-bucket-name] | \
grep -E '"(Key|VersionId)"' | \
perl -wp -e 's!.+("Key".+)\r?\n!$1!' | \
perl -wp -e 's!"Key": "(.+)", + "VersionId": "(.+)",!aws s3api delete-object --bucket [your-bucket-name] --key $1 --version-id $2!'
実行すると、こんな感じでAWS CLIを使ったコマンドが生成されます。
aws s3api delete-object --bucket [your-bucket-name] --key [object-key] --version-id [object-version-id]
aws s3api delete-object --bucket [your-bucket-name] --key [object-key] --version-id [object-version-id]
aws s3api delete-object --bucket [your-bucket-name] --key [object-key] --version-id [object-version-id]
aws s3api delete-object --bucket [your-bucket-name] --key [object-key] --version-id [object-version-id]
aws s3api delete-object --bucket [your-bucket-name] --key [object-key] --version-id [object-version-id]
aws s3api delete-object --bucket [your-bucket-name] --key [object-key] --version-id [object-version-id]
あとは、これをコンソールに貼り付けて実行するなり、そのまま実行するなりすればよいと思います。
なにも考えずに、そのまま全部消してしまう場合は、こんな感じで。
## [your-bucket-name]が 2箇所 にあるので、バケット名に置き換えてください
$ aws s3api list-object-versions --bucket [your-bucket-name] | \
grep -E '"(Key|VersionId)"' | \
perl -wp -e 's!.+("Key".+)\r?\n!$1!' | \
perl -wp -e 's!"Key": "(.+)", + "VersionId": "(.+)",!aws s3api delete-object --bucket [your-bucket-name] --key $1 --version-id $2!' | \
perl -wp -e 'system($_)'
削除したいキーを絞りたい場合は、grep
を間に挟んでもよいでしょう。
と、自分自身でこの記事の内容を何度も使っているうちに面倒になったので、シェルスクリプトにしました。
/usr/local/bin/truncate-versioned-s3-bucket
#!/bin/bash
for BUCKET_NAME in "$@"
do
aws s3api list-object-versions --bucket ${BUCKET_NAME} | grep -E '"(Key|VersionId)"' | perl -wp -e 's!.+("Key".+)\r?\n!$1!' | perl -wp -e 's!"Key": "(.+)", + "VersionId": "(.+)",!aws s3api delete-object --bucket '${BUCKET_NAME}' --key $1 --version-id $2!' | perl -wp -e 'system($_)'
done
実行権限を付与して
$ sudo chmod a+x /usr/local/bin/truncate-versioned-s3-bucket
バケット名を指定して実行します(複数バケット指定可)。
$ truncate-versioned-s3-bucket [bucket-name] [bucket-name] [bucket-name]...