AWS CDK でデプロイした Lambda 関数を以前のコードに戻したいです。以前のアセットはどこに残っていますか

AWS CDK でデプロイした Lambda 関数を以前のコードに戻したいです。以前のアセットはどこに残っていますか

AWS CDK で Lambda 関数をデプロイした後、コードに不具合が見つかった時の切り戻し方法について解説します。ブートストラップ S3 バケットにアセットがどう残るのか、`cdk gc` で削除される仕組み、そして素早く対応するための方法をまとめました。
2026.10.24

困っていること

AWS Cloud Development Kit(AWS CDK)で、Lambda 関数を管理しています。Lambda 関数のコードは、手元のフォルダをアセットとして渡しています(Code.fromAsset)。
新しいコードをデプロイした後に不具合が見つかったので、1 つ前のコードに戻したいです。

どう対応すればいいの?

以前のコードのアセットは、ブートストラップで作られた Amazon Simple Storage Service(Amazon S3)のバケットに、中身のハッシュを名前にして残ります。ブートストラップは、cdk bootstrap でデプロイに使う S3 バケットなどを先に作る作業です。
ただし cdk gc --unstable=gc を既定のオプションのまま実行し、確認のプロンプトで削除を承認すると、アセットは消えます。消えるのは、同じ環境のテンプレートから参照されておらず、作成から 1 日を超えたものです。

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/assets.html#assets-details

AWS CDK CLI はまずアセットを準備し、Amazon S3 バケットまたは Amazon ECR リポジトリに公開します。(S3 バケットまたはリポジトリはブートストラップ中に作成されます)。

なお、既定のブートストラップでは、S3 バケットの名前は cdk-hnb659fds-assets-<アカウント ID>-<リージョン> です。
S3 バケットにアセットが残っているかに関わらず戻すには、Git などで以前のソースに戻して cdk deploy し直してください。すぐに切り戻したい場合に備えるなら、Lambda のバージョンとエイリアスを使ってください。

確認してみた

2026 年 10 月 22 日に検証用 AWS アカウントの東京リージョンで確認しました。コード v1 をデプロイし、v2 に変えてもう一度デプロイすると、S3 バケットには v1 と v2 の 2 つの .zip が残りました。名前は、手元の cdk.out フォルダの asset.<ハッシュ> と同じハッシュでした。

01

2 つの .zip のうち、最終更新日時が 05:24:37 のものが v1 のアセットです。v2 をデプロイした後も残っています。
以前のコードのアセットも、cdk gc の対象になります。

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

For Amazon Simple Storage Service (Amazon S3) assets, the CDK CLI will check existing AWS CloudFormation templates in the same environment to see if they are referenced. If not referenced, they will be considered unused and eligible for garbage collection actions.

既定のブートストラップテンプレートのバケットは、バージョニングが有効です。

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/bootstrapping-env.html#bootstrap-template-history

新しい cdk gc コマンドではブートストラップバケット内のオブジェクトを削除する機能が導入されるため、この新しい動作により、削除されたオブジェクトは 365 日ではなく 30 日間ブートストラップバケットに残るようになります。

検証に使った S3 バケットは、ブートストラップテンプレートのバージョン 32 で作られていました。上の引用は、バージョン 24 で入った変更の説明で、バージョン 32 にも入っています。
このバケットには、CleanupOldVersions というライフサイクルルールがありました。古くなったバージョン(非現行バージョン)を、30 日後に完全に削除するルールです(NoncurrentVersionExpiration の NoncurrentDays が 30)。下の画面の一覧には、この 30 日は表示されません。

02

「最新バージョン…」の列は「-」なので、今あるアセットはこのルールでは消えません。

戻し方

次の順で戻します。

  1. Git で、Lambda 関数のコードを以前のコミットの状態に戻します(git revert など)。
  2. cdk deploy で、戻したソースから作ったアセットで関数を更新します。

戻した後は、Lambda 関数を呼び出し、以前のコードの結果が返ることを確認してください。

次から早く切り戻せるように、Lambda 関数のバージョンとエイリアスを CDK で作り、呼び出し元はエイリアスを使う形にしてください。バージョンは、発行したときのコードとほとんどの設定を固定したものです。エイリアスは、どのバージョンを指すかを付け替えられる名前です。
以前のバージョンを残すため、currentVersionOptions に removalPolicy: RemovalPolicy.RETAIN を指定します。問題が出たら、エイリアスを以前のバージョンに向け直し、エイリアスを呼び出して確認します。

removalPolicy の既定は RemovalPolicy.DESTROY です。下記 VersionOptions についての参考資料には、次のように記述がございます。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda.VersionOptions.html#removalpolicy

Whether to retain old versions of this function when a new version is created.

注意点

  • 2026 年 10 月 23 日時点の資料では、cdk gc には --unstable=gc の指定が要ります。戻す可能性があるうちは、--rollback-buffer-days=30 のように日数を指定してください。未使用と判定されたアセットにはまず日付のタグが付き、タグ付けから指定した日数を過ぎたものだけが削除されます。
  • エイリアスを AWS CLI やコンソールで付け替えると、CDK のテンプレートとずれます。切り戻しが済んだら CDK のコードも合わせてください。
  • currentVersion で作るバージョンの removalPolicy は、指定しないと既定の RemovalPolicy.DESTROY になります。この場合、コードを変えてデプロイすると以前のバージョンは削除されます。cdk synth で出したテンプレートでも、AWS::Lambda::Version に DeletionPolicy と UpdateReplacePolicy は付いていませんでした。

参考資料


AWSテクニカルサポートノートについて

過去にクラスメソッドのAWS総合支援サービスで頂いたお問合せの中から、通常のAWS利用時でも有益になりうる情報をテクニカルサポートチームがTIPSとしてご紹介しています。技術サポートは、無料でご提供しております。詳細は下記ボタンからご覧ください。

クラスメソッドのAWSサポートの詳細を見る

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事