年末は AWS 環境も大掃除しよう(delstack, cls3)

記事タイトルとURLをコピーする

はじめに

年末ですね。私は 12/29 から休暇に入るため、これを書いている今(12/28)はもう半分休暇気分です。

(なお、当社の年末年始休暇はこちらの通りです)

年末といえば大掃除ですね。AWSアカウントも不要なリソースを削除して新年を迎えたいものです。ということで、本記事ではリソース削除時に面倒なアレを解決するツールをご紹介します。

免責事項

本記事でご紹介するツールはAWS公式のものではなくオープンソースのものです。ご利用は自己責任でお願いします。

CloudFormation スタックの削除

リソースの削除といえばまずこれですね。

個人的には極力 IaC 化を行っているので、スタックを削除していけば大半のリソースは消えてくれるはずです。

マネコンの CloudFormation 画面から削除っと...

無惨に DELETE_FAILED するスタック達

そううまくはいきません。様々な理由でスタック削除を妨害してくる奴らがいます。

例えば、 S3バケットは中にオブジェクトが格納されている状態では削除することができません。オブジェクト削除 -> バケット削除 の手順を踏む必要があります。1つや2つであれば問題ありませんが、私の検証環境には、入社以来溜め込んだ大量のスタックがあるため難しいです。そんなときに使えるのが今回ご紹介するツールです。

delstack

github.com

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

github.com

やってみる

インストール

こちらも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環境も大掃除して、良い新年を迎えましょう。

あわせて読みたい

blog.serverworks.co.jp