手動での削除はめんどくさい。
こんにちは!AWS事業本部のおつまみです!
S3バケットを一撃で削除したいなぁと思ったことはありますか?私はあります。
つい先日CloudFomationでS3バケットを量産しすぎて、気づいたら同じプレフィックスのS3バケットを25個も作成してしまっていました。
通常S3バケットをマネージメントコンソールで削除する場合、以下の4ステップを踏む必要があります。
- 削除対象のバケットを選択し、「空にする」を選択する。
- 「完全に削除」を入力する。
- 削除対象のバケットを選択し、「削除」を選択する。
- バケット名を入力する。
これを25個全部で実施するのは、かなりめんどくさいですね。
そこでは今回はAWS CLIを使ったシェルスクリプトを使い、バージョニングが有効化された Amazon S3 バケットを一撃で削除したいと思います。
このブログで伝えたいこと
- バージョニングが有効化された Amazon S3 バケットは
aws s3 rm
コマンドだけでは完全にオブジェクトを削除できない。 - 旧バージョンのファイル削除には、
s3api delete-objects
を使用する必要がある。 - シェルスクリプトで効率化するのはいいね。
バージョニングが有効化された Amazon S3 バケットを削除するシェルスクリプト
作成したシェルスクリプトを記載します。
deleteS3.sh
#!/usr/bin/bash
bucket_name="$1"
# Abort the process if there is no argument
if [ $# != 1 ]; then
echo "Please enter an argument."
exit 1
fi
# Get the list of buckets to be deleted
backet_list=`aws s3api list-buckets | \
jq -r ".Buckets[].Name" | \
grep ${bucket_name} `
# There is no target bucket
if [ -z "${backet_list}" ]; then
echo "There was no target bucket."
exit 0
fi
# Confirm that you want to delete the bucket
echo "${backet_list}"
while true; do
read -p "Do you want to delete this buckets? (y/n)" yn
case $yn in
[Yy]* ) break;;
[Nn]* ) exit 0;;
* ) echo "Please answer yes or no.";;
esac
done
echo "Start deleting the bucket."
# Delete the bucket
echo "${backet_list}" | while read backet_name
do
echo "Deleting ${backet_name} ..."
aws s3api delete-objects --bucket $backet_name --delete "$(aws s3api list-object-versions --bucket $backet_name | jq '.Versions + .DeleteMarkers | {Objects: map({Key, VersionId}), Quiet: true}')"
aws s3 rb s3://$backet_name --force
done
echo "done"
こちらのシェルスクリプト、ほぼ先人(のんピさん)が作成されたものを流用させていただきました。ありがとうございました。
処理のフローものんピさんの上記ブログより引用しています。
- 引数として文字列を受け取る
- 引数が1つじゃない = 正しいフォーマットではない場合は異常終了する
aws s3 api list-buckets
とjq
、grep
で、引数として受け取った文字列がマッチするS3バケット名を取得する
- マッチしたS3バケットが何もなければ正常終了する
- マッチしたS3バケットの一覧を出力し、処理を続けるのか入力を受け付ける
- 削除するのであれば
yes
で、次の処理に進む- 削除しないのであれば、
no
で、正常終了するyes
もしくはno
以外の文字列が入力された場合は、繰り返し確認する- マッチしたS3バケットを順に削除する
修正箇所
修正箇所はハイライトがかかっている一行のみになります。
deleteS3.sh
#!/usr/bin/bash
bucket_name="$1"
# Abort the process if there is no argument
if [ $# != 1 ]; then
echo "Please enter an argument."
exit 1
fi
# Get the list of buckets to be deleted
backet_list=`aws s3api list-buckets | \
jq -r ".Buckets[].Name" | \
grep ${bucket_name} `
# There is no target bucket
if [ -z "${backet_list}" ]; then
echo "There was no target bucket."
exit 0
fi
# Confirm that you want to delete the bucket
echo "${backet_list}"
while true; do
read -p "Do you want to delete this buckets? (y/n)" yn
case $yn in
[Yy]* ) break;;
[Nn]* ) exit 0;;
* ) echo "Please answer yes or no.";;
esac
done
echo "Start deleting the bucket."
# Delete the bucket
echo "${backet_list}" | while read backet_name
do
echo "Deleting ${backet_name} ..."
aws s3api delete-objects --bucket $backet_name --delete "$(aws s3api list-object-versions --bucket $backet_name | jq '.Versions + .DeleteMarkers | {Objects: map({Key, VersionId}), Quiet: true}')"
aws s3 rb s3://$backet_name --force
done
echo "done"
aws s3 rb --forceだけでバケット削除できないの?
S3のバージョニングが有効になっている場合は旧バージョンのオブジェクトが削除されません。 バージョンニングが有効になっているオブジェクトで、実施をすると以下のようなエラーが発生します。
% aws s3 rb s3://hogehogebucket --force
remove_bucket failed: s3://hogehogebucket 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.
そのため、バージョニングが有効になっている場合は旧バージョンのファイル削除をするs3api delete-objects
を使用する必要があります。
s3api delete-objectsについて
AWS S3のAPIの1つで、S3バケットから複数のオブジェクトを削除するために使用されます。
このAPIを使用すると、1つ以上のオブジェクトを指定して、S3バケットから旧バージョンのファイルを同時に削除することができます。
例えば、以下のようなコマンドを使用して、S3バケットから複数のオブジェクトを削除することができます。
aws s3api delete-objects --bucket <bucket-name> --delete file://<file-name>
ただしこの場合は--delete
で単一のファイル指定しかできません。
一括削除するためには旧バージョンや削除マーカー含めて全てのファイルが指定される必要があるため、別途aws s3api list-object-versions
コマンドで情報を取得します。
aws s3api delete-objects --bucket $backet_name --delete "$(aws s3api list-object-versions --bucket $backet_name | jq '.Versions + .DeleteMarkers | {Objects: map({Key, VersionId}), Quiet: true}')"
今回スクリプトに追加したコマンドは、またもや先人(いわささん)が作成されたものをほぼ流用させていただきました。ありがとうございました。
実施してみた
Cloudshellから実行してみました。ログは以下のようになりました。
[cloudshell-user@ip-10-4-69-232 ~]$ sh deleteS3.sh windows-server-2022-for
windows-server-2022-for-bas-imagebuilderlogbucket-12atzebtnae4f
windows-server-2022-for-bas-imagebuilderlogbucket-15qm07xbr961i
windows-server-2022-for-bas-imagebuilderlogbucket-15snqjt7pi8oe
windows-server-2022-for-bas-imagebuilderlogbucket-16u71ylzfp2i9
windows-server-2022-for-bas-imagebuilderlogbucket-19ty6pde0v3ik
windows-server-2022-for-bas-imagebuilderlogbucket-1a1ag5kygpue1
windows-server-2022-for-bas-imagebuilderlogbucket-1e1n8ioaj85dj
windows-server-2022-for-bas-imagebuilderlogbucket-1gw6vbvs3wep3
windows-server-2022-for-bas-imagebuilderlogbucket-1gwzwhf0kkey3
windows-server-2022-for-bas-imagebuilderlogbucket-1hk8xxjnyxyi2
windows-server-2022-for-bas-imagebuilderlogbucket-1k32jqtegk6nx
windows-server-2022-for-bas-imagebuilderlogbucket-1k5nlwubosnpl
windows-server-2022-for-bas-imagebuilderlogbucket-1o4ypynussq9k
windows-server-2022-for-bas-imagebuilderlogbucket-1td1s7nv8zhjw
windows-server-2022-for-bas-imagebuilderlogbucket-5qydlxt62crq
windows-server-2022-for-bas-imagebuilderlogbucket-5wtvxi066tv4
windows-server-2022-for-bas-imagebuilderlogbucket-8t4qmpbyz54k
windows-server-2022-for-bas-imagebuilderlogbucket-9cbtopqiantx
windows-server-2022-for-bas-imagebuilderlogbucket-bvp59b5e21ap
windows-server-2022-for-bas-imagebuilderlogbucket-da3t5a952izb
windows-server-2022-for-bas-imagebuilderlogbucket-humufwi5zmml
windows-server-2022-for-bas-imagebuilderlogbucket-r6xar1fpj1b0
windows-server-2022-for-bas-imagebuilderlogbucket-rji4t70obgp2
windows-server-2022-for-bas-imagebuilderlogbucket-wck50cssdac
windows-server-2022-for-bas-imagebuilderlogbucket-y0vzjoep4iof
Do you want to delete this buckets? (y/n)y
Start deleting the bucket.
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-12atzebtnae4f ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-12atzebtnae4f
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-15qm07xbr961i ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-15qm07xbr961i
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-15snqjt7pi8oe ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-15snqjt7pi8oe
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-16u71ylzfp2i9 ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-16u71ylzfp2i9
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-19ty6pde0v3ik ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-19ty6pde0v3ik
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-1a1ag5kygpue1 ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-1a1ag5kygpue1
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-1e1n8ioaj85dj ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-1e1n8ioaj85dj
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-1gw6vbvs3wep3 ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-1gw6vbvs3wep3
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-1gwzwhf0kkey3 ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-1gwzwhf0kkey3
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-1hk8xxjnyxyi2 ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-1hk8xxjnyxyi2
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-1k32jqtegk6nx ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-1k32jqtegk6nx
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-1k5nlwubosnpl ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-1k5nlwubosnpl
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-1o4ypynussq9k ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-1o4ypynussq9k
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-1td1s7nv8zhjw ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-1td1s7nv8zhjw
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-5qydlxt62crq ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-5qydlxt62crq
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-5wtvxi066tv4 ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-5wtvxi066tv4
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-8t4qmpbyz54k ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-8t4qmpbyz54k
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-9cbtopqiantx ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-9cbtopqiantx
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-bvp59b5e21ap ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-bvp59b5e21ap
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-da3t5a952izb ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-da3t5a952izb
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-humufwi5zmml ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-humufwi5zmml
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-r6xar1fpj1b0 ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-r6xar1fpj1b0
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-rji4t70obgp2 ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-rji4t70obgp2
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-wck50cssdac ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-wck50cssdac
Deleting windows-server-2022-for-bas-imagebuilderlogbucket-y0vzjoep4iof ...
remove_bucket: windows-server-2022-for-bas-imagebuilderlogbucket-y0vzjoep4iof
done
実行完了後再度マネージメントコンソールからS3バケットの一覧を確認すると、25個あったバケットが無事削除されていました!
ちなみに全て削除されるのに3分ほど時間がかかりました。
さいごに
今回はバージョニングが有効化された Amazon S3 バケットをAWS CLIで一撃削除する方法をご紹介しました。
先人のブログのおかげでかなり時間短縮することができました。ありがとうございます。
最後までお読みいただきありがとうございました!
どなたかのお役に立てれば幸いです。
以上、おつまみ(@AWS11077)でした!