Gemcook Tech Blog
🗑️

AWS CDK v2.163.0 で追加された gc コマンドで無駄なアセットを削除する

2024/11/19に公開

こんにちは、soso です!
最近の AWS CDK v2.163.0 で cdk gc コマンドが unstable で追加されました。cdk 本体にコマンドが追加されるのはあまりないので、気になって調査&実際に試してみました。

結論

  • cdk gc コマンドは溜まった不要なアセットを削除するためのコマンド
    • CFn から参照されていないアセットを削除
  • 大規模なプロジェクトならコスト削減の効果があり
    • 小規模だと年間数十円程度のコスト削減に留まる

gc コマンドとは

gc はガベージコレクションの略で、不要なアセットを削除するためのコマンドです。Bootstrap で作成したアセット内から CFn から参照されていないファイルを一括削除してくれます。

Use the AWS Cloud Development Kit (AWS CDK) command line interface (CLI) cdk gc command to perform garbage collection on unused assets stored in the resources of your bootstrap stack. Use this command to view, manage, and delete assets that you no longer need.

https://docs.aws.amazon.com/cdk/v2/guide/ref-cli-cmd-gc.html

そもそもなぜ必要なのか?

公式ドキュメントを読んで何をするコマンドかはわかりましたが、背景や動機が気になったので深堀りしてみます。この Issue でおよそ 6 年前にコマンドが提案されていたようです。

https://github.com/aws/aws-cdk-rfcs/issues/64

これは私も知らなかったのですが、CDK の S3 or ECR に保存されているアセットはそのままだと削除されないためファイル数とサイズが増え続けるという問題があります。
いくつかの本番プロジェクトを覗いてみたところ、合計バケットサイズが数 GB になっているものがありました。とはいえ S3 の保存料金は 1GB あたり$0.023~0.025/月なので、数 GB 程度ではぶっちゃけ気にするほどではなさそうです(低いに越したことはないので、自動で消えてくれるとありがたいが...)

Issue 内のコメントでは無駄なファイルのサイズが数 TB(およそ年間$700)に達している人もいるようで、相当な大規模なプロジェクトでは結構なコストになりますね。

ちなみにこのコマンドが実装される前は有志が作ったコンストラクトでアセットを削除していた人もいるようです。

ToolkitCleaner

試してみる

unstable なコマンドということもあり本番環境で試すのは怖いので、念の為 Playground 環境の cdk で試してみます。
コマンドを実行する前にアセットを保存している S3 バケットの中身を確認しておきます。

cdk bootstrap を実行すると CFn 経由で S3 バケットが作成されるので、そのバケット内にアセットが保存されているはずです。2 年ほど前に作成した痕跡が残っていたので、そこから S3 バケットを確認。

とりあえず、現状のアセットは 24 ファイルあることが確認できました。
このファイル群に不要になっている未使用ファイルがあるかはわかりませんが、cdk gc コマンドを実行して試してみます。

オプションは色々ありますが、カスタマイズしたいところも無いので基本的なオプションで実行。
--profile は必要に応じて設定してください。

cdk gc --unstable=gc --type=s3 --profile=xxxxx

実行すると以下のようなログが出力されます。

Found 24 assets to delete based off of the following criteria:
- assets have been isolated for > 0 days
- assets were created > 1 days ago

Delete this batch (yes/no/delete-all)? y

削除して良いので y を入力。

[0.00%] 0 files scanned: 0 assets (0.00 MiB) tagged, 0 assets (0.00 MiB) deleted.
[100.00%] 24 files scanned: 0 assets (0.00 MiB) tagged, 24 assets (0.11 MiB) deleted.

今回は CFn から参照しているアセットがなかったので 24 ファイルすべてが削除されました。マネコンでも確認してみます。

このあと動作に問題ないか cdk diffcdk deploy 等を行ってみましたが、特に問題なく動作しました。

まとめ

cdk gc コマンドは不要なアセットを削除するためのコマンドでした。
CFn と連携した後の不要アセットは CDK が自動削除してくれてるものだと思ってたので残り続けるのは意外。このあたりのアセットの管理は削除も含めて CDK が自動で行ってほしいところですが、CDK と CFn の橋渡しをしている部分なので難しいところがあるのかな・・・?
とはいえ、CDK ユーザー側で自動化するほどでもないので 1 年に 1 回実行するぐらいが丁度良さそうですね。

GitHubで編集を提案
Gemcook Tech Blog
Gemcook Tech Blog

Discussion