[一撃]正規表現で一致したS3バケットを削除するシェルスクリプトを書いてみた

マネージメントコンソールでS3バケットを削除していくの、地味にめんどくさくないですか?
2021.05.04

うわっ…私のバケット、多すぎ…?

こんにちは、のん です。

cdk deploycdk destroyで楽しくスクラップビルドをしていたら、S3バケットが大量に作成されていた
なんてことはありませんか? 私はあります。

現在の私の環境のS3バケットは42個もありました。

マネージメントコンソールからS3バケットを削除する際には、バケットを1つずつ選択して一度バケットの中身を空にしてから削除する必要があります。 真心を込めた手作業で対応しても時間が勿体ないです。

ここでS3バケット名をご覧いただくと分かりますが、作成されたS3バケット名は先頭は固定の文字列で、後半はランダムな文字列(モザイクの裏側)になっています。
これを利用して正規表現に一致したS3バケットを一撃で大量に削除しようと思います。

正規表現に一致したS3バケットを削除するシェルスクリプト

作成したシェルスクリプトを記載します。
処理のフローとしては以下の通りです。

  • 引数として文字列を受け取る
    • 引数が1つじゃない = 正しいフォーマットではない場合は異常終了する
  • aws s3 api list-bucketsjqgrepで、引数として受け取った文字列がマッチするS3バケット名を取得する
    • マッチしたS3バケットが何もなければ正常終了する
  • マッチしたS3バケットの一覧を出力し、処理を続けるのか入力を受け付ける
    • 削除するのであればyesで、次の処理に進む
    • 削除しないのであれば、noで、正常終了する
    • yesもしくはno以外の文字列が入力された場合は、繰り返し確認する
  • マッチしたS3バケットを順に削除する

delete-s3buckets.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 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の余暇時間を活かして環境を整理してみてはいかがでしょうか。

以上、東京オフィスの のん(@non____97)でした!