Help us understand the problem. What is going on with this article?

バージョニングを有効にしたS3で、オブジェクトを一気に削除したい

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.

本当にずっと持っていたいバケットなら困らないんですけど、テスト目的で作ったバケットとかだと削除したい場合に面倒になります…。

バージョニングを有効にした S3 バケットの削除方法

で、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を間に挟んでもよいでしょう。

charon
"CROSS THE RUBICON”
https://github.com/charon-r13b
tis
創業40年超のSIerです。
https://www.tis.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした