はじめに
年末ですね。私は 12/29 から休暇に入るため、これを書いている今(12/28)はもう半分休暇気分です。
(なお、当社の年末年始休暇はこちらの通りです)
年末といえば大掃除ですね。AWSアカウントも不要なリソースを削除して新年を迎えたいものです。ということで、本記事ではリソース削除時に面倒なアレを解決するツールをご紹介します。
免責事項
本記事でご紹介するツールはAWS公式のものではなくオープンソースのものです。ご利用は自己責任でお願いします。
CloudFormation スタックの削除
リソースの削除といえばまずこれですね。
個人的には極力 IaC 化を行っているので、スタックを削除していけば大半のリソースは消えてくれるはずです。
マネコンの CloudFormation 画面から削除っと...
そううまくはいきません。様々な理由でスタック削除を妨害してくる奴らがいます。
例えば、 S3バケットは中にオブジェクトが格納されている状態では削除することができません。オブジェクト削除 -> バケット削除 の手順を踏む必要があります。1つや2つであれば問題ありませんが、私の検証環境には、入社以来溜め込んだ大量のスタックがあるため難しいです。そんなときに使えるのが今回ご紹介するツールです。
delstack
delstack はスタック削除の阻害要因も解決しつつスタックの削除を行ってくれます。S3 のオブジェクト問題以外で解決してくれる阻害要因達は README を参照してください。
やってみる
インストール
今回はCloudShell 上で動かしてみます。まずはインストールから。
$ curl -fsSL https://raw.githubusercontent.com/go-to-k/delstack/main/install.sh | sh
helpが表示できればOKです。
$ delstack -h NAME: delstack - A CLI tool to force delete the entire CloudFormation stack. USAGE: delstack [global options] [arguments...] VERSION: 1.5.0 GLOBAL OPTIONS: --stackName value, -s value CloudFormation stack name --profile value, -p value AWS profile name --region value, -r value AWS region --interactive, -i Interactive Mode (default: false) --help, -h show help --version, -v print the version
まずは1スタックのみ削除
早速削除してみます。オプションでスタック名を指定すれば良いようです。S3 にオブジェクトが含まれていて削除に失敗したスタックを指定します。
$ delstack -s serverless-fastapi-mangun-example-dev INF Start deletion, serverless-fastapi-mangun-example-dev INF Please wait a few minutes... INF Successfully deleted, serverless-fastapi-mangun-example-dev
1分程待つと当該スタックの削除が完了した旨、ログが表示されました!べんり!
DELETE_FAILED
となったスタック達をまとめて削除
というわけで、手動削除で DELETE_FAILED
となったスタック達をどんどん消していきます。まずはステータスが DELETE_FAILED
のスタック名一覧を取得方法を確認します。
$ aws cloudformation list-stacks \ --query 'StackSummaries[?StackStatus==`DELETE_FAILED`].[StackName]' \ --output text | tr '\t' '\n' foo-stack bar-stack baz-stack
出力されたスタック一覧に問題ないことを確認(大事)したら、以下のワンライナーでドーンとスタック達を削除します。
$ aws cloudformation list-stacks \ --query 'StackSummaries[?StackStatus==`DELETE_FAILED`].[StackName]' \ --output text | tr '\t' '\n' \ | xargs -I {} delstack -s {}
時間がかかるので、コーヒーでも飲んで待ちましょう。
S3 バケットの削除
さて、先ほどはイキって 個人的には極力 IaC 化を行っている
などと書きましたが、手動でリソースを作ることもあります。その中でも大掃除したいリソースの筆頭が S3バケットです。
確認したところ、私の検証環境には以下の通り113のバケットがありました。気が向いたときに削除するようにしていますが、かなりゴミがありそうです。
前述の通り、S3 バケットの削除には予めオブジェクトの削除をする必要があります。これをやってくれるのが cls3 です。(先ほどの delstack と同じ作者さんです。)
cls3
やってみる
インストール
こちらもCloudShell 上で動かしてみます。まずはインストールから。
$ curl -fsSL https://raw.githubusercontent.com/go-to-k/cls3/main/install.sh | sh
helpが表示できればOKです。
$ cls3 -h NAME: cls3 - A CLI tool to clear all objects in S3 Buckets or delete Buckets. USAGE: cls3 [global options] [arguments...] VERSION: 0.15.0 GLOBAL OPTIONS: --bucketName value, -b value [ --bucketName value, -b value ] S3 bucket names(one or more) --profile value, -p value AWS profile name --region value, -r value AWS region --force, -f Delete a bucket together (default: false) --interactive, -i Interactive Mode (default: false) --quiet, -q Not to display a progress bar (default: false) --oldVersionsOnly, -o Delete old version objects only (including all delete-markers) (default: false) --help, -h show help --version, -v print the version
まずは1バケットのみ削除
まずは1バケットのみ削除します。オプションでバケット名を指定すればOKです。-f
オプションをつけるとバケットも削除してくれます。(付けない場合はオブジェクトの削除のみ)
$ cls3 -b your-bucket-name -f INF your-bucket-name Checking... INF your-bucket-name Clearing... 100% |██████████████████████████████████████████████████| (215/215) INF your-bucket-name Cleared!!: 215 objects. INF your-bucket-name Deleted!!
215個のオブジェクトを削除し、バケットも削除してくれました。
まとめて削除
-b
オプションは複数指定可能です。以下のように複数バケットまとめて処理できます。
$ cls3 -b my-bucket-name -b your-bucket-name -f
不要なバケットをまとめて削除できました。べんり!
バケット一覧を取得するコマンドも一応置いておきます。
$ aws s3 ls | awk '{print $3}'
まとめ
AWS環境も大掃除して、良い新年を迎えましょう。