Node.js による Lambda 関数の構築 - AWS Lambda

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
名前 識別子 オペレーティングシステム 廃止日 関数の作成をブロックする 関数の更新をブロックする

Node.js 20

nodejs20.x

Amazon Linux 2023

Node.js 18

nodejs18.x

Amazon Linux 2

Node.js 16

nodejs16.x

Amazon Linux 2

2024 年 6 月 12 日

2025 年 2 月 28 日

2025 年 3 月 31 日

注記

Node.js 18 以降のランタイムは AWS SDK for JavaScript v3 を使用しています。以前のランタイムから関数を移行するには、GitHub の「移行ワークショップ」の手順に従ってください。AWS SDK for JavaScript バージョン 3 の詳細については、「モジュラー AWS SDK for JavaScript が一般公開されました」のブログ記事を参照してください。

Node.js 関数を作成するには
  1. Lambda コンソールを開きます。

  2. [Create function] (関数の作成) をクリックします。

  3. 以下の設定を行います。

    • [Function name]: 関数名を入力します。

    • [ランタイム]: [Node.js 20.x] を選択します。

  4. [Create function] (関数の作成) をクリックします。

  5. テストイベントを設定するには、[テスト] を選択します。

  6. [イベント名] で、「test」と入力します。

  7. [変更を保存] をクリックします。

  8. [テスト] を選択して関数を呼び出します。

コンソールが、index.js または index.mjs という名前の単一のソースファイルを使用する Lambda 関数を作成します。このファイルを編集し、組み込みのコードエディタでファイルをさらに追加することができます。変更を保存するには [保存] を選択します。コードを実行するには、[Test] (テスト) を選択します。

注記

Lambda コンソールでは、AWS Cloud9 を使用して、ブラウザに統合開発環境を提供します。また、AWS Cloud9 を使用して、独自の環境で Lambda 関数を開発することもできます。詳細については、AWS Cloud9 ユーザーガイドの「AWS Toolkit を使用した AWS Lambda 関数の使用」を参照してください。

index.js または index.mjs ファイルは、イベントオブジェクトとコンテキストオブジェクトを取得する handler という名前の関数をエクスポートします。これは、関数が呼び出されるときに Lambda が呼び出すハンドラー関数です。Node.js 関数のランタイムは、Lambda から呼び出しイベントを取得し、ハンドラに渡します。関数設定で、ハンドラ値は index.handler です。

関数コードを保存すると、Lambda コンソールは .zip ファイルアーカイブのデプロイパッケージを作成します。コンソール外で (SDE を使用して) 関数コードを開発するときは、デプロイパッケージを作成して、Lambda 関数にコードをアップロードします。

注記

ローカル環境でアプリケーション開発を開始するには、このガイドの GitHub リポジトリで利用可能なサンプルアプリケーションの 1 つをデプロイします。

Node.js のサンプル Lambda アプリケーション
  • blank-nodejs – ログ記録、環境変数、AWS X-Ray トレース、レイヤー、単位テスト、AWS SDK の使用を示す Node.js 関数。

  • nodejs-apig – API Gateway からのイベントを処理し、HTTP レスポンスを返す公開 API エンドポイントを持つ関数。

  • efs-nodejs – Amazon VPC で Amazon EFS ファイルシステムを使用する関数。このサンプルには、Lambda で使用するように設定された VPC、ファイルシステム、マウントターゲット、アクセスポイントが含まれます。

関数のランタイムによって、呼び出しイベントに加えて、コンテキストオブジェクトがハンドラに渡されます。コンテキストオブジェクトには、呼び出し、関数、および実行環境に関する追加情報が含まれます。詳細情報は、環境変数から入手できます。

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 ファイルで typemodule として指定する方法と、.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 関数を作成します。

注記

Node.js バージョン 18 以降に対応する以下のコード例は、CommonJS 形式を使用しています。Lambda コンソールで関数を作成する場合は、コードを含むファイル名を index.js に変更してください。

例 Node.js 18 およびそれ以降
const { version } = require("@aws-sdk/client-s3/package.json"); exports.handler = async () => ({ version });

これにより、次の形式で応答が返されます。

{ "version": "3.462.0" }

TCP 接続にキープアライブを使用

デフォルトの Node.js HTTP/HTTPS エージェントは新しいリクエストがあるたびに新しい TCP 接続を作成します。新しい接続を確立するコストを回避するために、AWS SDK for JavaScript を使用して、関数が行う接続を再利用するために keepAlive: true を使用することができます。キープアライブは、SDK を使用して複数の API 呼び出しを行う Lambda 関数のリクエスト時間を短縮することができます。

nodejs18.x 以降の Lambda ランタイムに含まれている AWS SDK for JavaScript 3.x では、キープアライブがデフォルトで有効になっています。キープアライブを無効にするには、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 に設定して証明書をロードします。