Amazon S3の空のバケットをすべて削除する
こんにちは。サービスグループの武田です。
先日IAM管理ポリシーをお掃除するスクリプトを書きました。
今回はバケットお掃除編です。ライフサイクルポリシーを設定したうえで、すでに使わなくなっていたバケットが空の状態で放置されていました。やはり1個2個ならマネコンでぽちぽちでもいいのですが、大量にあると確認画面が煩わしいですね。
今回もaws
とjq
コマンドおよびbash環境で動作するスクリプトを書いてみました。ローカルに環境がない場合はAWS CloudShellで実行してみてください。
#!/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をすべて消す」シリーズができるくらい増えるとちょっと楽しいですね。