Amazon S3の空のバケットをすべて削除する

IAM管理ポリシーのお掃除に続いて空のS3バケットをお掃除しましょう。
2022.04.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。サービスグループの武田です。

先日IAM管理ポリシーをお掃除するスクリプトを書きました。

今回はバケットお掃除編です。ライフサイクルポリシーを設定したうえで、すでに使わなくなっていたバケットが空の状態で放置されていました。やはり1個2個ならマネコンでぽちぽちでもいいのですが、大量にあると確認画面が煩わしいですね。

今回もawsjqコマンドおよびbash環境で動作するスクリプトを書いてみました。ローカルに環境がない場合はAWS CloudShellで実行してみてください。

delete-empty-buckets.sh

#!/bin/bash

dryrun=$1

set -eu

buckets=$(aws s3api list-buckets | jq -r '.Buckets[].Name')

for bucket in $buckets; do
    objs=$(aws s3api list-objects-v2 --bucket "$bucket" --max-items 1)

    if [[ "$objs" == "" ]]; then
        if [[ "$dryrun" != "" ]]; then
            echo "$bucket"
        else
            aws s3api delete-bucket --bucket "$bucket"
            echo "delete ${bucket}"
        fi
    fi
done

前回のスクリプトで、「いきなり実行するのは怖い」という意見を見かけました。それもそうだな、ということで今回はDryRunできます。

$ ./delete-empty-buckets.sh dryrun

と実行することで、削除するバケット名の出力だけします。実際には適当なパラメターを渡せばDryRunします。S3バケットの仕様として空でないバケットは消せないため、間違って必要なオブジェクトごと消してしまったということは起きないので安心してください。とはいえ「運用に必要だけど今は空」というバケットを誤って消さないように注意はしてください。

list-objects-v2は結果をJSON形式で返すのですが、空のバケットの場合は「空文字列」を返してきました。APIによっては「空のリスト」を返すものもあるので、この辺は実際に試してみて動作確認が必要ですね。

まとめ

「AWSのxxをすべて消す」シリーズができるくらい増えるとちょっと楽しいですね。