LoginSignup
2
0

古いCDKでLambdaがデプロイできない原因(の一つ)

Last updated at Posted at 2024-03-12

背景

以下のようなことが起きました

  • 古いバージョンのCDKでリソースをデプロイしようとした(新規スタック作成・既存スタック更新)
    • CDKの中でLambdaリソースを定義している
    • そのLambdaのランタイムはまだサポートされている
  • にもかかわらず、「Lambdaのランタイムがサポート外」というエラーでデプロイできなかった

環境

  • Node.js: 12.22.2
  • CDK: 1.119.0

実際のログ

5:41:20 AM | CREATE_FAILED        | AWS::Lambda::Function       | LogRetentionaae0aa...b201efdd8aFD4BFC8A
Resource handler returned message: "The runtime parameter of nodejs14.x is no longer supported for creating or updating AWS Lambda functions. We recommend you use the new runtime (no
dejs20.x) while creating or updating functions. (Service: Lambda, Status Code: 400, Request ID: (略))" (RequestToken: (略), HandlerErrorCode: InvalidRequest)

        new LogRetentionFunction (/home/ec2-user/environment/proj/node_modules/@aws-cdk/aws-logs/lib/log-retention.ts:122:22)
        \_ LogRetention.ensureSingletonLogRetentionFunction (/home/ec2-user/environment/proj/node_modules/@aws-cdk/aws-logs/lib/log-retention.ts:89:12)
        \_ new LogRetention (/home/ec2-user/environment/proj/node_modules/@aws-cdk/aws-logs/lib/log-retention.ts:48:27)
        \_ new Function 

(以下略)

原因(結論)

実際のログをよく読めばわかるのですが、「Lambdaのランタイムがサポート外」というエラーは、LogRetention作成時に起きています。 自分で定義しているLambdaのランタイムバージョンは関係ないということです。
詳しくは以下の通りです。

  • CDKでのLambda定義にて logRetention 引数でログの保持期間を設定していた
  • ログの保持期間を設定すると、ログローテートLambdaがCDK内部で自動作成される
  • 上記バージョンのCDKでは、ログローテートLambdaのRuntimeバージョン指定をベタがきで nodejs14.x 指定していた

CDKパッケージ内の原因箇所のリンク

解決方法

元のソースコードを全く変えずにデプロイする方法?

ないと思われます。StackOverflowやGitHub Issuesをある程度漁りましたが、大体結論は以下の解決法1:CDKバージョンを上げる でした。

試験的に、ログローテートLambdaのRuntime指定部分を変えてみましたが、デプロイ処理が止まってしまいました。(「原因」を力づくで解決しようとすると、パッケージに改変を行うことになりますので、この方向での解決はやめましょう。)

解決法1:CDKバージョンを上げる

記法が変わるなど影響はあるかもしれませんが、これしかないかと思います。
また、CDKバージョンを上げる際、ほぼ確実に環境のNode.jsのバージョンも上げることになると思います。
今回私はこちらの方法を選択することになりました。

解決法2 (新規スタック作成時のみ可)

ログローテートLambdaを自動作成しない方法があるようです。この解決法は既存スタック更新には利用できないようです。CDK内部でバージョン固定のログローテートLambdaが作られないのは良いですね。

簡単な手順は以下の通りです。

  1. 事前にロググループリソースを自前で定義する
  2. そのロググループにログ保持期間を設定
  3. そのロググループに、対象Lambdaを紐づける

("logRetention lambda runtime" などで調べていたら出てきた記事で、私が実際には試したわけではありません)。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0