[一撃]正規表現で一致したS3バケットを削除するシェルスクリプトを書いてみた
うわっ…私のバケット、多すぎ…?
こんにちは、のんピ です。
cdk deploy
とcdk destroy
で楽しくスクラップビルドをしていたら、S3バケットが大量に作成されていた
なんてことはありませんか? 私はあります。
現在の私の環境のS3バケットは42個もありました。
マネージメントコンソールからS3バケットを削除する際には、バケットを1つずつ選択して一度バケットの中身を空にしてから削除する必要があります。 真心を込めた手作業で対応しても時間が勿体ないです。
ここでS3バケット名をご覧いただくと分かりますが、作成されたS3バケット名は先頭は固定の文字列で、後半はランダムな文字列(モザイクの裏側)になっています。
これを利用して正規表現に一致したS3バケットを一撃で大量に削除しようと思います。
正規表現に一致したS3バケットを削除するシェルスクリプト
作成したシェルスクリプトを記載します。
処理のフローとしては以下の通りです。
- 引数として文字列を受け取る
- 引数が1つじゃない = 正しいフォーマットではない場合は異常終了する
aws s3 api list-buckets
とjq
、grep
で、引数として受け取った文字列がマッチするS3バケット名を取得する- マッチしたS3バケットが何もなければ正常終了する
- マッチしたS3バケットの一覧を出力し、処理を続けるのか入力を受け付ける
- 削除するのであれば
yes
で、次の処理に進む - 削除しないのであれば、
no
で、正常終了する yes
もしくはno
以外の文字列が入力された場合は、繰り返し確認する
- 削除するのであれば
- マッチしたS3バケットを順に削除する
#!/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 s3 rb s3://$backet_name --force done echo "done"
実行してみた
それでは早速実行してみます。
Cloudshellから実行してみました。ログは以下のようになりました。(ログはコメントや空行、マスキングなどで整形しています。)
// 引数がない場合異常終了することを確認 [cloudshell-user@ip-10-0-1-89 ~]$ bash delete-s3buckets.sh Please enter an argument. // 渡した文字列に一致するS3バケットがない場合異常終了することを確認 [cloudshell-user@ip-10-0-1-89 ~]$ bash delete-s3buckets.sh 12345678 There was no target bucket. // "flow"という文字列が含まれるS3バケットをリストアップできることを確認 // 処理を途中で中断できることを確認 [cloudshell-user@ip-10-0-1-89 ~]$ bash delete-s3buckets.sh flow appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx Do you want to delete this buckets? (y/n)n // "flow"から始まるS3バケットが見つからず、異常終了することを確認 [cloudshell-user@ip-10-0-1-89 ~]$ bash delete-s3buckets.sh ^flow There was no target bucket. // 先頭が"a"で間に0文字以上の文字列があり、その後"pp"を含むS3バケットがあることを確認 // y と n 以外を入力した場合、再度確認されることを確認 [cloudshell-user@ip-10-0-1-89 ~]$ bash delete-s3buckets.sh ^a.*pp appstack-contentsbucket571b0902-1hnefmrkvdamd appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx Do you want to delete this buckets? (y/n) Please answer yes or no. Do you want to delete this buckets? (y/n)n // "appstack-flowlogsbucket"から始まるS3バケットがあることを確認 // 削除対象のS3バケットの中身が空になり、S3バケット自体も削除されることを確認 [cloudshell-user@ip-10-0-1-89 ~]$ bash delete-s3buckets.sh ^appstack-flowlogsbucket appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx appstack-flowlogsbucket8912xxxxxxxxxxxxxx Do you want to delete this buckets? (y/n)y Start deleting the bucket. Deleting appstack-flowlogsbucket8912xxxxxxxxxxxxxx delete: s3://appstack-flowlogsbucket8912xxxxxxxxxxxxxx-/ delete: s3://appstack-flowlogsbucket8912xxxxxxxxxxxxxx-/984900217833_vpcflowlogs_us-east-2_fl-0f240fd60b2b9d8a8_20210421T0125Z_ea3827d3.log.gz delete: s3://appstack-flowlogsbucket8912xxxxxxxxxxxxxx-/984900217833_vpcflowlogs_us-east-2_fl-0f240fd60b2b9d8a8_20210421T0120Z_73278245.log.gz delete: s3://appstack-flowlogsbucket8912xxxxxxxxxxxxxx-/984900217833_vpcflowlogs_us-east-2_fl-0f240fd60b2b9d8a8_20210421T0120Z_fab1391a.log.gz (中略) Deleting appstack-flowlogsbucket8912xxxxxxxxxxxxxx remove_bucket: appstack-flowlogsbucket8912xxxxxxxxxxxxxx Deleting appstack-flowlogsbucket8912xxxxxxxxxxxxxx delete: s3://appstack-flowlogsbucket8912xxxxxxxxxxxxxx-/ delete: s3://appstack-flowlogsbucket8912xxxxxxxxxxxxxx-/984900217833_vpcflowlogs_us-east-1_fl-09227d000e7879198_20210425T0905Z_a3b0e54f.log.gz remove_bucket: appstack-flowlogsbucket8912xxxxxxxxxxxxxx done
実行完了後再度マネージメントコンソールからS3バケットの一覧を確認すると、42個あったバケットが7個に減っていました。めでたしめでたし。
スクリプトは便利
せっかくのGWなので片付けも兼ねてスクリプトで処理してみました。
スクリプトを使うと面倒な作業も時短できるので良いですよね。スクリプトで綺麗に処理が流れると心の中も綺麗になった気がします。
皆さんもGWの余暇時間を活かして環境を整理してみてはいかがでしょうか。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!