AWS Amplify Gen 2で作成されるLambda関数(Node.js)のデフォルトバージョンについて検証してみた

AWS Amplify Gen 2で作成されるLambda関数(Node.js)のデフォルトバージョンについて検証してみた

デフォルトバージョンがNode.js 18.x から 20.x になっていました。
Clock Icon2025.05.22

こんにちは、なおにしです。

AWS Amplify gen 2 で作成されるLambda関数(Node.js)について、ランタイムのバージョン周りを検討する機会がありましたのでご紹介します。

はじめに

AWS Lambda においてサポートされるランタイムはドキュメントにまとまっており、Node.jsの場合は執筆時点で以下のとおりになっています。

名前 識別子 オペレーティングシステム 廃止日 関数の作成をブロックする 関数の更新をブロックする
Node.js 22 nodejs22.x Amazon Linux 2023 2027 年 4 月 30 日 2027 年 6 月 1 日 2027 年 7 月 1 日
Node.js 20 nodejs20.x Amazon Linux 2023 2026 年 4 月 30 日 2026 年 6 月 1 日 2026 年 7 月 1 日
Node.js 18 nodejs18.x Amazon Linux 2 2025 年 9 月 1 日 2025 年 10 月 1 日 2025 年 11 月 1 日

記載のとおり、LambdaにおけるNode.js 18 については廃止日が迫っており、利用されている方は既にメール通知を受け取っていたり、AWS Health Dashboard や AWS Trusted Advisor で確認されているかと思います。

これは、Node.js 18 自体のEOLが2025年4月30日となっており、既にサポート終了になっていることから、Lambda としても段階的に廃止する形になっています。

https://github.com/nodejs/Release

一方、2025年5月6日にはNode.js 24 がリリースされ、こちらのバージョンは10月にはアクティブLTSとしてリリースされるので、いずれはLambda のランタイムに追加されるかと思いますが、執筆時点でのLambdaにおける最新バージョンはNode.js 22 です。

標題の内容に戻りまして、先月(2025/4)あたりに作成したAmplify gen 2 のプロジェクトでも、デフォルトではNode.js 18 のLambda関数が作成されることから、私も廃止に関するメール通知を受け取っていました。

Node.js 18がデフォルトのままで大丈夫なのかな?と微妙に気にはなっていたのですが(特に重要なシステムで使用しているわけではないのでスルーしていました)、先日の記事でAmplify関連を含むパッケージのアップデートを行ったところ、作成されたLambda関数がNode.js 20 になっていました。

リリースを追ってはいなかったので確認したところ、2025年4月25日にリリースされたaws-amplify/backendのバージョン1.16.0でデフォルトが変更されていたようです。

https://github.com/aws-amplify/amplify-backend/releases/tag/%40aws-amplify%2Fbackend%401.16.0

結論としてAmplifyパッケージのバージョンアップをしましょう、ではこれで終わってしまうので、デプロイされるLambda 関数のバージョンに関してもう少し深掘りしてみます。

というわけで、defineFunctionで作成したLambda関数のバージョンを変更してみます。

やってみた

先日の記事でパッケージのアップデートを適用せずに記載の内容を進めた状態で確認します。各パッケージのバージョンは以下のとおりです。

確認コマンド
npm outdated | awk '{print $1, $2, $3, $4}' | awk 'NR==1 {print "| " $1 " | " $2 " | " $3 " | " $4 " |"; print "| --- | --- | --- | --- |"} NR>1 {print "| " $1 " | " $2 " | " $3 " | " $4 " |"}'
Package Current Wanted Latest
@aws-amplify/backend 1.5.0 1.16.1 1.16.1
@aws-amplify/backend-cli 1.2.9 1.7.2 1.7.2
@aws-amplify/ui-react 6.5.5 6.11.2 6.11.2
@types/react 18.3.12 18.3.22 19.1.5
@types/react-dom 18.3.1 18.3.7 19.1.5
@typescript-eslint/eslint-plugin 7.18.0 7.18.0 8.32.1
@typescript-eslint/parser 7.18.0 7.18.0 8.32.1
@vitejs/plugin-react 4.3.3 4.4.1 4.4.1
aws-amplify 6.6.6 6.14.4 6.14.4
aws-cdk 2.163.1 2.1016.1 2.1016.1
aws-cdk-lib 2.163.1 2.197.0 2.197.0
esbuild 0.20.2 0.20.2 0.25.4
eslint 8.57.1 8.57.1 9.27.0
eslint-plugin-react-hooks 4.6.2 4.6.2 5.2.0
eslint-plugin-react-refresh 0.4.13 0.4.20 0.4.20
react 18.3.1 18.3.1 19.1.0
react-dom 18.3.1 18.3.1 19.1.0
tsx 4.19.1 4.19.4 4.19.4
typescript 5.6.3 5.8.3 5.8.3
vite 5.4.10 5.4.19 6.3.5

アップデートを適用しなかった場合、作成された関数は以下のとおりです。

20250522_naonishi_aws-amplify-gen2-lambda-nodejs-runtime-version_1.png

一方、アップデートをした場合に作成された関数は以下のとおりです。

20250522_naonishi_aws-amplify-gen2-lambda-nodejs-runtime-version_2.png

いずれの環境もLambda関数は5つ作成されていますが、アップデートした場合の方はNode.jsのランタイムが全て20になっています。

5つの関数のうち、amplify-amplifyvitereactt-postconfirmationで始まる関数がLambdaトリガーとして作成したものであるため、Pythonと残り3つのNode.js による関数はdefineFunctionとは別に自動的に作成されたものになります。

amplify-amplifyvitereactt-CustomS3AutoDeleteObjectで始まる関数についてはNode.js 20 ですが、それ以外はNode.js 18 です。したがって、仮にdefineFunctionを使用していなかったとしても、Lambdaとして関数の作成をブロックする日付を超えた後に、Amplifyのパッケージを未アップデートのままデプロイを試みるとおそらく失敗しそうです。

結果的に、LambdaのNode.js ランタイムのライフサイクルを意識してAmplifyのパッケージもアップデートが必要ということになるかと思います。

そう考えると、バージョンアップのサイクルが短めなNode.js に対して、AmplifyではLambdaで利用可能な最も古いランタイムバージョンがデフォルトになっていますが、少なくともdefineFunctionで作成するNode.js の関数については最初からデフォルトではなく新しめのランタイムを指定して関数を作成する方が良さそうです。

defineFunctionでは以下のようにruntimeを指定することができます。

amplify/auth/post-confirmation/resource.ts
import { defineFunction } from '@aws-amplify/backend';

export const postConfirmation = defineFunction({
  name: 'post-confirmation',
+  runtime: 20,
  environment: {
    TARGET_ADDRESS: 'nishimura.naoki@example.com',
    SOURCE_ADDRESS: 'Amplifyテスト <naonishi@mail.example.com>'
  }
});

未指定だった状態でランタイムを指定すると、対象のLambda関数だけが置き換わりました。

20250522_naonishi_aws-amplify-gen2-lambda-nodejs-runtime-version_3.jpg

このためランタイムを指定すれば良いだけではあるのですが、そもそもaws-amplify/backendのバージョン1.5.0だとNode.js 20 までしか選択することができません。

20250522_naonishi_aws-amplify-gen2-lambda-nodejs-runtime-version_4.png

aws-amplify/backendのバージョン1.5.0がリリースされたのが2024年10月16日、Node.js 22 がLambdaでサポート開始されたのが2024年11月22日なので当然と言えば当然です。

また、コードにはNodeVersionについて以下のように記載があるので、デフォルトとして古いバージョンを選択するのが方針だということも読み取れます。

Defaults to the oldest NodeJS LTS version.

aws-amplify/backendのバージョン1.16.1では以下のようにNode.js 22まで選択可能です。

20250522_naonishi_aws-amplify-gen2-lambda-nodejs-runtime-version_5.png

なお、Node.js 22 が選択できるようになったのはaws-amplify/backendのバージョン1.9.0からのようで、こちらは2024年12月10日のリリースです。

つまり、より新しいバージョンのNode.js ランタイムを選択するのであれば、結局Amplifyのパッケージもバージョンアップが必要です。

まとめ

オンプレミス環境やEC2でのセルフホスティングであれば良い悪いは別として諸々の事情で古いバージョンのNode.js が稼働しているパターンもあるかと思いますが、LambdaやAmplifyを使用している状況ではアップデートに追従する必要があることを改めて意識しました。
改修/テスト/デプロイを都度対応するのは大変ですが、導入時点で今後アップデートに追従する運用を意識して予算や体制を組めると理想的だなと思います。

本記事がどなたかのお役に立てれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.