Node.js による Lambda 関数の構築
AWS Lambda の Node.js を使用して JavaScript コードを実行できます。Lambda は Node.js のランタイムを指定して、イベントを処理するコードを実行します。コードは、管理している AWS Identity and Access Management (IAM) ロールの認証情報を使用して、AWS SDK for JavaScript を含む環境で実行されます。Node.js ランタイムに含まれている SDK バージョンの詳細については、「ランタイムに含まれる SDK バージョン」を参照してください。
Lambda は、以下の Node.js ランタイムをサポートしています。
名前 | 識別子 | オペレーティングシステム | 廃止日 | 関数の作成をブロックする | 関数の更新をブロックする |
---|---|---|---|---|---|
Node.js 22 |
|
Amazon Linux 2023 |
スケジュールされていません |
スケジュールされていません |
スケジュールされていません |
Node.js 20 |
|
Amazon Linux 2023 |
スケジュールされていません |
スケジュールされていません |
スケジュールされていません |
Node.js 18 |
|
Amazon Linux 2 |
2025 年 7 月 31 日 |
2025 年 9 月 1 日 |
2025 年 10 月 1 日 |
Node.js 関数を作成するには
-
Lambda コンソール
を開きます。 -
[Create function] (関数の作成) をクリックします。
-
以下の設定を行います。
-
[Function name]: 関数名を入力します。
-
[ランタイム]: [Node.js 22.x] を選択します。
-
-
[Create function (関数の作成)] を選択します。
コンソールで、index.mjs
という名前の単一のソースファイルを含む Lambda 関数が作成されます。このファイルを編集し、組み込みのコードエディタでファイルをさらに追加することができます。[DEPLOY] セクションで [デプロイ] を選択して関数のコードを更新します。次に、コードを実行するには、[TEST EVENTS] セクションで [テストイベントを作成] を選択します。
index.mjs
ファイルは、イベントオブジェクトおよびコンテキストオブジェクトを取得する handler
という名前の関数をエクスポートします。これは、関数が呼び出されるときに Lambda が呼び出すハンドラー関数です。Node.js 関数のランタイムは、Lambda から呼び出しイベントを取得し、ハンドラに渡します。関数設定で、ハンドラ値は index.handler
です。
関数コードを保存すると、Lambda コンソールは .zip ファイルアーカイブのデプロイパッケージを作成します。コンソール外で (SDE を使用して) 関数コードを開発するときは、デプロイパッケージを作成して、Lambda 関数にコードをアップロードします。
関数のランタイムによって、呼び出しイベントに加えて、コンテキストオブジェクトがハンドラに渡されます。コンテキストオブジェクトには、呼び出し、関数、および実行環境に関する追加情報が含まれます。詳細情報は、環境変数から入手できます。
Lambda 関数には CloudWatch Logs ロググループが付属しています。関数のランタイムは、各呼び出しに関する詳細を CloudWatch Logs に送信します。これは呼び出し時に、任意の関数が出力するログを中継します。関数がエラーを返す場合、Lambda はエラー形式を整え、それを呼び出し元に返します。
トピック
Node.js の初期化
Node.js には独特なイベントループモデルがあるため、その初期化動作が他のランタイムとは異なります。具体的に言うと、Node.js は非同期操作をサポートするノンブロッキング I/O モデルを使用します。このモデルにより、Node.js はほとんどのワークロードに対して効率的に動作できます。例えば、Node.js 関数がネットワークコールを実行する場合、そのリクエストを非同期操作として指定し、コールバックキューに置くことができます。この関数は、ネットワークコールが返されるのを待つことで、ブロックされることなくメインコールスタック内の他の操作を引き続き処理することができます。ネットワークコールが完了すると、そのコールバックが実行され、コールバックキューから削除されます。
一部の初期化タスクは非同期的に実行される場合があります。これらの非同期タスクは、呼び出し前に実行が完了することが保証されていません。例えば、AWS パラメータストアからパラメータを取得するためのネットワークコールを実行するコードは、Lambda がハンドラー関数を実行する時までに完了しない場合があります。その結果、呼び出し中は変数が null になることがあります。これを回避するには、関数のコアビジネスロジックの残りの部分を続行する前に、変数とその他の非同期コードが完全に初期化されていることを確認してください。
別の手段として、関数コードを ES モジュールとして指定することもできます。これは、関数ハンドラーの範囲外で、ファイルのトップレベルで await
を使用することを可能にします。Promise
ごとに await
すると、ハンドラーの呼び出し前に非同期初期化コードが完了されるので、コールドスタートレイテンシーの削減におけるプロビジョニングされた同時実行の効果を最大限に引き出すことができます。詳細情報と例については、「AWS Lambda で Node.js ES モジュールと Top-Level Await を使用する
ES モジュールとしての関数ハンドラーの指定
デフォルトで、Lambda は .js
サフィックスが付いたファイルを CommonJS モジュールとして扱います。オプションで、コードを ES モジュールとして指定できます。これは、関数の package.json
ファイルで type
を module
として指定する方法と、.mjs
のファイル名拡張子を使用する方法の 2 つの方法で実行できます。最初のアプローチでは、関数コードがすべての .js
ファイルを ES モジュールとして扱い、2 番目のシナリオでは、.mjs
で指定したファイルのみが ES モジュールになります。.mjs
ファイルは常に ES モジュールであり、.cjs
ファイルは常に CommonJS モジュールであることから、ES モジュールと CommonJS モジュールをそれぞれ .mjs
および .cjs
として命名することで、それらを混在させることができます。
Lambda は、ES モジュールのロード時に NODE_PATH
環境変数内のフォルダを検索します。ES モジュールの import
ステートメントを使用して、ランタイムに含まれている AWS SDK をロードできます。レイヤーから ES モジュールをロードすることも可能です。
ランタイムに含まれる SDK バージョン
Node.js ランタイムに含まれる AWS SDK のバージョンは、ランタイムバージョンと AWS リージョン によって異なります。使用しているランタイムに含まれている SDK のバージョンを確認するには、次のコードを使用して Lambda 関数を作成します。
例 index.mjs
import packageJson from '@aws-sdk/client-s3/package.json' assert { type: 'json' }; export const handler = async () => ({ version: packageJson.version });
これにより、次の形式で応答が返されます。
{ "version": "3.632.0" }
TCP 接続にキープアライブを使用
デフォルトの Node.js HTTP/HTTPS エージェントは新しいリクエストがあるたびに新しい TCP 接続を作成します。新しい接続を確立するコストが発生しないように、キープアライブは nodejs18.x
以降の Lambda ランタイムではデフォルトで有効になっています。キープアライブは、SDK を使用して複数の API 呼び出しを行う Lambda 関数のリクエスト時間を短縮することができます。
キープアライブを無効にするには、AWS SDK for JavaScript 3.x 開発者ガイドの「Node.js でのキープアライブによる接続の再利用」を参照してください。キープアライブの使用の詳細については、AWS 開発者ツールブログの「HTTP キープアライブはモジュラー AWS SDK for JavaScript でデフォルトでオンになっています
CA 証明書のロード
Node.js 18 までのバージョンの Node.js ランタイムでは、他の AWS のサービスと相互作用する関数を簡単に作成できるように、Lambda が Amazon 固有の CA (認証局) 証明書を自動的にロードします。例えば、Lambda には、Amazon RDS データベースにインストールされているサーバー ID 証明書を検証するために必要な Amazon RDS 証明書が含まれています。この動作は、コールドスタート時のパフォーマンスに影響を与える可能性があります。
Node.js 20 以降では、Lambda がデフォルトで追加の CA 証明書をロードすることはありません。Node.js 20 ランタイムには、/var/runtime/ca-cert.pem
にあるすべての Amazon CA 証明書を含む証明書ファイルが含まれています。Node.js 18 以前のランタイムと同じ動作を復元するには、NODE_EXTRA_CA_CERTS
環境変数を /var/runtime/ca-cert.pem
に設定します。
最適なパフォーマンスを得るには、必要な証明書のみをデプロイパッケージにバンドルし、NODE_EXTRA_CA_CERTS
環境変数を使用してロードすることをお勧めします。証明書ファイルには、1 つ以上の信頼できるルート CA 証明書または中間 CA 証明書が PEM 形式で含まれている必要があります。例えば RDS の場合は、必要な証明書をコードと共に certificates/rds.pem
として含めてください。次に、NODE_EXTRA_CA_CERTS
を /var/task/certificates/rds.pem
に設定して証明書をロードします。