LoginSignup
6
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-06-20

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

と、自分自身でこの記事の内容を何度も使っているうちに面倒になったので、シェルスクリプトにしました。

/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]...
6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3