AWS Cloud Development Kit (CDK) は、開発者が使い慣れたプログラミング言語でクラウドインフラストラクチャを定義できるオープンソースのフレームワークです。さらに CDK は高レベルの抽象化 (Constructs) を提供し、AWS 上でのシステム構築における AWS サービスの定義と統合に必要な複雑さを軽減します。CDK はまた、CDK Assets のなどのコア機能も提供しており、ユーザーはアプリケーションアセットを CDK アプリケーションにバンドルすることができます。これらのアセットには、ローカルファイル (main.py)、ディレクトリ (python_app/)、または Docker イメージ (Dockerfile) を含めることができます。CDK Assets は、CDK bootstrapping 時に作成される Amazon Simple Storage Service (Amazon S3) バケットまたは Amazon Elastic Container Registry (Amazon ECR) リポジトリに保存されます。
アセットを大規模に活用する CDK 開発者は、時間の経過とともにブートストラップされたバケットやリポジトリに古いデータや使用されていないデータが蓄積されることに気付くかもしれません。ユーザーが自分でこのデータをクリーンアップしようとしても、CDK は安全に削除できるデータを判断する明確な方法を提供していませんでした。この問題を解決するために CDK Garbage Collection のプレビュー版リリースを発表できることを嬉しく思います。これは、ブートストラップされた Amazon S3 バケットと Amazon ECR リポジトリ内の古いアセットを自動的に削除する CDK の新機能で、ユーザーの時間とコストを節約します。この機能は AWS CDK バージョン 2.165.0 から利用可能です。
CDK Garbage Collection により、お客様の CDK の使用体験を損なうことなく、関連するストレージコストを削減できるでしょう。
クイックスタート
CDK Garbage Collection は、gc
という名前の CDK CLI コマンドとして提供されています。デフォルト設定で CDK Garbage Collection を使用するには、CDK アプリケーションのターミナルで次のコマンドを実行します。
--unstable
フラグは、CDK Garbage Collection がプレビューモードであることを認識するためのものです。これは、この機能のスコープと API がまだ変更される可能性があることを示していますが、それ以外の点では、この機能は一般的に本番環境での使用が可能で、完全にサポートされています。
手順
CDK Garbage Collection は環境レベルで動作するため、cdk gc
を呼び出した AWS アカウントおよびリージョンにある孤立した (どこからも参照されていない) アセットを削除しようとします (翻訳者補足: CDK における環境 (Environment) は、アカウントとリージョンの組み合わせによって識別されます。詳しくは こちら のドキュメントを参照してください。)。このチュートリアルではカスタムの修飾子を使用して環境を再ブートストラップすることで、準備が整う前に孤立したアセットが削除されることを防ぎます。
CDKToolkitDemo という名前の新しいブートストラップテンプレートと、それに関連するブートストラップリソースが作成されました。次に、Amazon S3 と Amazon ECR のアセットを含む CDK アプリケーションをセットアップします。
次のステップでは、lib/garbage-collection-demo-stack.ts
の既存のコードを、以下の CDK スタックに置き換えます。
これにより、2 つの AWS Lambda 関数が作成されます。1 つは Amazon S3 アセットをソースコードとして使用し、もう 1 つは Amazon ECR イメージをソースコードとして使用します。参照されているアセットを CDK アプリケーションに追加する必要があります。lambda/index.js
にシンプルな Lambda 関数を追加します:
そして docker/Dockerfile
にシンプルな Docker イメージを追加します。
これで cdk deploy
を実行して、CDK アプリケーションを AWS アカウントにセットアップすることができます。
この時点で、ブートストラップされた Amazon S3 バケットと Amazon ECR リポジトリにアセットが正しく追加されていることを確認できます:

最初の AWS CDK デプロイ後、ブートストラップされた Amazon S3 バケットには 2 つのオブジェクトが存在します。

最初の AWS CDK デプロイ後、ブートストラップされた Amazon ECR リポジトリには 1 つのイメージが存在します。
出力には、両方のブートストラップされたリソースに期待どおりのデータが含まれていることが示されています。Amazon S3 バケットには、cdk deploy を実行したときに生成された AWS CloudFormation テンプレートの json ファイルも保存されます。
これで、両方のアセットを更新して、一般的な CDK 開発サイクルをシミュレートできます。lambda/index.js
にある Amazon S3 アセットに小さな変更を追加します:
同じことを docker/Dockerfile
内でも行います:
cdk deploy
を再度実行すると、両方のアセットが新しいハッシュの下で再アップロードされるはずです。

2 回目の AWS CDK デプロイ後、ブートストラップされた Amazon S3 バケットには 4 つのオブジェクトが存在します。

2 回目の AWS CDK デプロイ後、ブートストラップされた Amazon ECR リポジトリには 2 つのイメージが存在します。
この出力から新しいアセットが追加されたことが確認できます。新しくブートストラップされたリソースを使用しているため、どのリソースが現在孤立しているか、そうでないかを判断できます。現時点では、50f409b9
というプレフィックスが付いた ZIP ファイルのみが AWS CloudFormation で参照されており、Amazon ECR では a5801b5b
というプレフィックスが付いたイメージのみが参照されています。つまり、他のすべてのアセット(Amazon S3 の 3 つのオブジェクトと Amazon ECR の 1 つのオブジェクト)は孤立しており、削除できます。
ローカルアセットではない追加のファイルが Amazon S3 にあることに注目してみましょう。これらは AWS CloudFormation テンプレートで、AWS CloudFormation に送信される前の中間ステップとして Amazon S3 にアップロードされたものです。これらのファイルはコピーされた後は不要であり、CDK Garbage Collection による削除の最適な候補です。
ここで CDK Garbage Collection の出番です。適切なパラメータを設定することで、アクティブに使用されているアセットに触れることなく、孤立したオブジェクトをクリーンアップすることができます。
アセットをすぐに削除したい場合(後で削除するためのタグ付けをするのではなく)は、 rollback-buffer-days を 0 に設定してください。また、作成されたばかりのアセットも削除したい場合は、 created-buffer-days も 0 に設定するようにしてください。created-buffer-daysのデフォルト値は1です。
CDK Garbage Collection が Amazon S3 から削除すべき3つのアセットを検出しました。これは想定通りの動作です。削除を確認するよう促されるので、削除したい場合は yes
と入力してください。すると、次のような応答が表示されます:
さらに以下のように続きます:
再度確認が促されますが、これは Amazon ECR のアセット削除のための質問なので、もう一度 yes
と入力します。すると、次のような応答が表示されます:
これで CDK Garbage Collection は完了です。
詳細
CDK Garbage Collection は、シナリオに応じて動作をカスタマイズするためのパラメータを提供しています。これらのオプションは、ガベージコレクションをどの程度積極的に行いたいかを決定するのに役立ちます。
- rollback-buffer-days: アセットが削除の対象となるために、孤立した状態としてマークされていなければならない日数
- created-buffer-days: アセットが削除の対象となるために、作成日から経過しなければならない日数
rollback-buffer-days は、cdk deploy
を使用せず、パイプラインのようにテンプレートのみで動作するデプロイメント方法を使用している場合に検討しましょう。パイプラインが CDK CLI を介さずにロールバックできる場合、このパラメータはアセットが早すぎるタイミングで削除されないようにするのに役立ちます。これを使用すると、cdk gc
は未使用のオブジェクトを削除する代わりに、現在の日付でそれらにタグ付けします。以降のcdk gc
の実行では、このタグをチェックし、指定されたバッファ日数よりも長くタグ付けされている場合にのみアセットを削除します。
created-buffer-daysは、アップロードされたばかりのアセットについて特に安全を期したい場合に検討しましょう。これを使用すると、cdk gc
は作成後にその日数が経過していないアセットを除外します。ただし、これには複数の CDK アプリ間で共有されているアセットが含まれない場合があることに注意してください。CDK はアセットを再利用するため、最近デプロイされたCDKアプリでも、それよりも以前にアップロードされたアセットを参照している可能性があります。
例えば、1ヶ月以上経過し、かつ1週間孤立したものとしてマークされていたアセットのみを削除したい場合は、次のように指定できます:

アセットがガベージコレクション対象として監査される際の判断フロー図です。
CDK Garbage Collection の制限事項
CDK Garbage Collection の実行中には、どのアセットが使用中かを確認するために、すべてのスタックのテンプレートを収集します。アセットのアップロードとスタックのデプロイメントの間にガベージコレクションが実行される場合、最新のスタックデプロイメントを検出できないが最新のアセットは検出するという状況が発生する可能性があります。このシナリオでは、CDK Garbage Collection がそれらのアセットを削除してしまう可能性があります。
CDK Garbage Collection の実行中にスタックをデプロイすることはお勧めしません。避けられない場合は、--created-buffer-days
を設定することで、最近作成されたアセットがガベージコレクションによって削除されるのを防ぐことができます。万が一デプロイに失敗した場合は、再デプロイすることで対処できます。アセットのアップロードステップで不足しているアセットを再アップロードできるためです。実際には、この競合状態は特定のエッジケースでのみ発生し、起こる可能性は低いです。しかし、私たちはこの競合状態のリスクを軽減するために、CDK アセットを保存する新しい方法に取り組んでいます。この作業はこの Issue で追跡されています。
まとめ
CDK Garbage Collection は、ユーザーが AWS アカウント内の使用されていない CDK アセットのライフサイクル管理を支援します。ユーザーが CDK の活用規模を拡大し続ける中、CDK Garbage Collection のようなツールは、クリーンで効率的、かつコスト効果の高いクラウド環境を維持する上で重要な役割を果たします。CDK ユーザーの皆様には、ぜひこの機能を試し、フィードバック を提供し、AWSリソース管理を最適化するためにワークフローに組み込んでいただけると嬉しいです。
本記事は 2025/2/21 に投稿された Announcing CDK Garbage Collection を翻訳したものです。翻訳は Solutions Architect : 国兼 周平 (Shuhei Kunikane) が担当しました。