AWSS3

バージョニングを有効化したS3バケットのファイルをAWS CLIで一括削除する

バージョニングを有効にしたS3バケットをAWS CLIコマンドで空にします。

AWSマネジメントコンソールでも、バケット選択 → [ 空にする ] → [ 完全に削除 ] と入力 → [ 空にする ] をクリックすれば一括削除できますが、複数バケットある場合はそれなりに手間なのでコマンドでサクッと削除してみます。

スポンサーリンク

一括削除コマンド

list-object-versionsとdelete-objectのワンライナーで一括削除

コマンド先頭のbucketを対象のバケット名に変更してから実行してください。

$ bucket=zoo200-bucket && aws s3api list-object-versions --bucket $bucket | jq -r '.Versions[] | [.Key, .VersionId] |@tsv' | while read k v;do aws s3api delete-object --bucket $bucket --key $k --version-id $v; done
...
$

このワンライナーは、まずlist-object-versionsコマンドのレスポンスのバージョンIDとキー(S3のファイルパス)を jqコマンドで抽出 → それを1行ずつtsv形式(基本的にIFSはタブや空白)で出力 → 各バージョンとキーをwhile文中のdelete-objectコマンドに渡して削除 という流れです。

$ aws s3api list-object-versions --bucket zoo200-bucket
{
    "Versions": [
        {
            "ETag": "\"3b7c42xxxx\"",
            "Size": 4,
            "StorageClass": "STANDARD",
            "Key": "demo-file",
            "VersionId": "Zconi6xxxx",
            "IsLatest": true,
            "LastModified": "2022-05-03T11:12:19+00:00",
            "Owner": {
                "DisplayName": "xyz",
                "ID": "6bbb16xxxx"
            }
        },
        {
...
            "Key": "demo-file",
            "VersionId": "QeVwNoxxxx",
...
        },
        {
...
            "Key": "demo-file",
            "VersionId": "d27wQXxxxx",
...
        }
    ]
}
$
## 上記のレスポンスをタブ区切りに整形
$ bucket=zoo200-bucket && aws s3api list-object-versions --bucket $bucket | jq -r '.Versions[] | [.Key, .VersionId] |@tsv'
demo-file	Zconi6xxxx
demo-file	QeVwNoxxxx
demo-file	d27wQXxxxx
$
## whileループでdelete-objectを実行
$ bucket=zoo200-bucket && aws s3api list-object-versions --bucket $bucket | jq -r '.Versions[] | [.Key, .VersionId] |@tsv' | while read k v;do echo aws s3api delete-object --bucket $bucket --key $k --version-id $v; done
aws s3api delete-object --bucket zoo200-bucket --key demo-file --version-id Zconi6xxxx
aws s3api delete-object --bucket zoo200-bucket --key demo-file --version-id QeVwNoxxxx
aws s3api delete-object --bucket zoo200-bucket --key demo-file --version-id d27wQXxxxx
$

なおdelete-objectはversion-idを指定しないと削除マーカーがつくのみで実際にオブジェクトは削除はされません。

delete-objectsとjsonファイルで一括削除

ファイル作成の必要があるためサクッとではありませんが、delete-objects(複数形)コマンドに削除対象のバージョンとキーを記述したJSONファイルを渡すことでも一括削除ができます。

$ cat delete.json
{
  "Objects": [
    {
      "Key": "demo-file",
      "VersionId": "AL_Yj4xxxx"
    },
    {
      "Key": "demo-file",
      "VersionId": "1gOKX7xxxx"
    },
    {
      "Key": "demo-file",
      "VersionId": "HHFzJIxxxx"
    }
  ]
}
$
$ aws s3api delete-objects  --bucket zoo200-bucket --delete file://delete.json
...
$

今回は以上です〜ノシ

参考

(`・ω・´)ノ アリガトウゴザイマス!!

S3 オブジェクトの過去バージョンを一括削除する
シェル芸で使いたい jqイディオム
jq Manual