Node.js Lambda 関数のレイヤーを操作する - AWS Lambda

Node.js Lambda 関数のレイヤーを操作する

Lambda レイヤー は、補助的なコードやデータを含む .zip ファイルアーカイブです。レイヤーには通常、ライブラリの依存関係、カスタムランタイム、または設定ファイルが含まれています。レイヤーの作成には、次の 3 つの一般的な手順が含まれます。

  1. レイヤーコンテンツのパッケージ化。これは、関数で使用する依存関係を含む .zip ファイルアーカイブを作成することを意味します。

  2. Lambda でレイヤーを作成します。

  3. レイヤーを関数に追加します。

このトピックには、外部ライブラリの依存関係を持つ Node.js Lambda レイヤーを適切にパッケージ化して作成する方法に関する手順およびガイダンスが含まれています。

前提条件

このセクションの手順を完了するには、次の事項が必要です。

このトピックでは、aws-lambda-developer-guide GitHub リポジトリの layer-nodejs サンプルアプリケーションを参照します。このアプリケーションには、依存関係をダウンロードしてレイヤーにパッケージ化するスクリプトが含まれています。アプリケーションは対応する関数も含んでおり、レイヤーの依存関係を使用します。レイヤーを作成したら、対応する関数をデプロイして呼び出し、すべてが動作することを確認できます。このサンプルアプリケーションは、Node.js 20 ランタイムを使用します。依存関係をレイヤーに追加する場合は、Node.js 20 と互換性がある必要があります。

layer-nodejs サンプルアプリケーションは、lodash ライブラリを Lambda レイヤーにパッケージ化します。layer ディレクトリには、レイヤーを生成するスクリプトが含まれています。function ディレクトリには、レイヤーの動作をテストするサンプル関数が含まれています。このドキュメントでは、このレイヤーを作成、パッケージ化、デプロイ、テストする方法について説明します。

Node.js レイヤーの Lambda ランタイム環境との互換性

Node.js レイヤーでコードをパッケージ化する場合は、コードと互換性のある Lambda ランタイム環境を指定します。ランタイムとのコードの互換性を評価するには、Node.js のバージョン、オペレーティングシステム、およびコードが設計されている命令セットアーキテクチャを考慮します。

Lambda Node.js ランタイムでは、Node.js のバージョンとオペレーティングシステムが指定されます。このドキュメントでは、AL2023 に基づく Node.js 20 ランタイムを使用します。ランタイムのバージョンの詳細については、「ランタイムのサポート」を参照してください。Lambda 関数を作成するときに、命令セットアーキテクチャを指定します。このドキュメントでは、arm64 アーキテクチャを使用します。Lambda のアーキテクチャの詳細については、「Lambda 関数の命令セットアーキテクチャの選択と設定」を参照してください。

パッケージで提供されるコードを使用する場合、各パッケージ管理者は互換性を個別に定義します。ほとんどの Node.js 開発は、オペレーティングシステムや命令セットアーキテクチャとは独立して動作するように設計されています。また、新しい Node.js バージョンとの非互換性がなくなることは一般的ではありません。Node.js バージョン、オペレーティングシステム、または命令セットアーキテクチャとのパッケージ互換性を評価するよりも、パッケージ間の互換性を評価するのに多くの時間がかかることが予想されます。

Node.js パッケージにはコンパイルされたコードが含まれている場合があり、その場合はオペレーティングシステムと命令セットアーキテクチャの互換性を考慮する必要があります。パッケージのコード互換性を評価する必要がある場合は、パッケージとそのドキュメントを調査する必要があります。NPM のパッケージでは、package.json マニフェストファイルの enginesos、および cpu フィールドを通じて互換性を指定できます。package.json ファイルの詳細については、NPM ドキュメントの「package.json」を参照してください。

Node.js ランタイムのレイヤーパス

関数にレイヤーを追加すると、Lambda はレイヤーのコンテンツを実行環境に読み込みます。レイヤーが特定のフォルダパスに依存関係をパッケージ化すると、Node.js 実行環境がモジュールを認識し、関数コードからモジュールを参照できます。

モジュールが確実に取得されるようにするには、次のいずれかのフォルダパスのレイヤー .zip ファイルにパッケージ化します。これらのファイルは /opt に保存され、フォルダパスは PATH 環境変数にロードされます。

  • nodejs/node_modules

  • nodejs/nodeX/node_modules

例えば、このチュートリアルで作成するレイヤーの .zip ファイルは、次のディレクトリ構造になっています。

layer_content.zip └ nodejs └ node20 └ node_modules └ lodash └ <other potential dependencies> └ ...

lodash ライブラリは nodejs/node20/node_modules ディレクトリに配置します。これにより、Lambda は関数の呼び出し中にライブラリを見つけられるようになります。

レイヤーコンテンツのパッケージ化

この例では、lodash ライブラリをレイヤーの .zip ファイルにパッケージ化します。レイヤーコンテンツをインストールしてパッケージ化するには、次の手順を実行します。

レイヤーコンテンツをインストールしてパッケージ化する方法
  1. sample-apps/layer-nodejs ディレクトリで必要なサンプルコードを含む aws-lambda-developer-guide リポジトリを GitHub から複製します。

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. layer-nodejs サンプルアプリの layer ディレクトリに移動します。このディレクトリには、レイヤーを適切に作成してパッケージ化するために使用するスクリプトが含まれています。

    cd aws-lambda-developer-guide/sample-apps/layer-nodejs/layer
  3. package.json ファイルに lodash がリストされていることを確認します。このファイルは、レイヤーに含める依存関係を定義します。このファイルを更新し、レイヤーに必要な依存関係を含めることができます。

    注記

    このステップで使用される package.json は、依存関係が Lambda レイヤーにアップロードされた後は依存関係と共に保存されず、使用されません。このファイルはレイヤーパッケージ化プロセスでのみ使用され、Node.js アプリケーションまたは公開されたパッケージのファイルのように実行コマンドと互換性を指定することはありません。

  4. layer ディレクトリでスクリプトを実行するシェル権限があることを確認します。

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. 次のコマンドを使用して「1-install.sh」スクリプトを実行します。

    ./1-install.sh

    このスクリプトは npm install を実行します。これにより、package.json が読み取られ、その内部で定義されている依存関係がダウンロードされます。

    例 1-install.sh
    npm install .
  6. 次のコマンドを使用して「2-package.sh」スクリプトを実行します。

    ./2-package.sh

    このスクリプトは、node_modules ディレクトリから nodejs/node20 という名前の新しいディレクトリに内容をコピーします。次に、nodejs ディレクトリの内容を layer_content.zip という名前のファイルに圧縮します。これはレイヤーの .zip ファイルです。ファイルを解凍し、Node.js ランタイムのレイヤーパス セクションで示されている正しいファイル構造が含まれていることを確認できます。

    例 2-package.sh
    mkdir -p nodejs/node20 cp -r node_modules nodejs/node20/ zip -r layer_content.zip nodejs

レイヤーを作成する

前のセクションで生成した layer_content.zip ファイルを取得し、Lambda レイヤーとしてアップロードします。AWS Command Line Interface (AWS CLI) を介して AWS Management Consoleまたは Lambda API を使用してレイヤーをアップロードできます。レイヤーの .zip ファイルをアップロードするとき、次の「PublishLayerVersion」 AWS CLI コマンドで nodejs20.x を互換性のあるランタイムとして指定し、arm64 を互換性のあるアーキテクチャとして指定します。

aws lambda publish-layer-version --layer-name nodejs-lodash-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes nodejs20.x \ --compatible-architectures "arm64"

レスポンスでは、arn:aws:lambda:us-east-1:123456789012:layer:nodejs-lodash-layer:1 に似ている LayerVersionArn に注目してください。この Amazon リソースネーム (ARN) は、このチュートリアルの次の手順で、レイヤーを関数に追加するときに必要になります。

レイヤーを関数に追加する

関数コードで lodash ライブラリを使用するサンプル Lambda 関数をデプロイし、作成したレイヤーをアタッチします。関数をデプロイするには、実行ロールが必要です。詳細については、「実行ロールを使用した Lambda 関数のアクセス許可の定義」を参照してください。既存の実行ロールをお持ちでない場合、折りたたみ可能なセクションの手順を実行してください。それ以外の場合、次の手順に進んで関数をデプロイします。

実行ロールを作成する
  1. IAM コンソールの [ロールページ] を開きます。

  2. [ロールの作成] を選択します。

  3. 次のプロパティでロールを作成します。

    • 信頼されたエンティティLambda

    • アクセス許可AWSLambdaBasicExecutionRole

    • ロール名lambda-role

    AWSLambdaBasicExecutionRole ポリシーには、ログを CloudWatch Logs に書き込むために関数が必要とするアクセス許可があります。

サンプルの関数コードでは、lodash _.findLastIndex メソッドを使用してオブジェクトの配列を読み取ります。オブジェクトを条件と比較し、一致のインデックスを見つけます。その後、Lambda レスポンスでオブジェクトのインデックスと値を返します。

import _ from "lodash" export const handler = async (event) => { var users = [ { 'user': 'Carlos', 'active': true }, { 'user': 'Gil-dong', 'active': false }, { 'user': 'Pat', 'active': false } ]; let out = _.findLastIndex(users, function(o) { return o.user == 'Pat'; }); const response = { statusCode: 200, body: JSON.stringify(out + ", " + users[out].user), }; return response; };
Lambda 関数をデプロイする方法
  1. function/ ディレクトリに移動します。現在、layer/ ディレクトリにいる場合、次のコマンドを実行します。

    cd ../function-js
  2. 次のコマンドを使用し、.zip ファイルのデプロイパッケージを作成します。

    zip my_deployment_package.zip index.mjs
  3. 関数をデプロイします。次の AWS CLI コマンドで、--role パラメータを実行ロール ARN に置き換えます。

    aws lambda create-function --function-name nodejs_function_with_layer \ --runtime nodejs20.x \ --architectures "arm64" \ --handler index.handler \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://my_deployment_package.zip
  4. レイヤーを関数にアタッチします。次の AWS CLI コマンドで、--layers パラメーターを先にメモしたレイヤーバージョン ARN に置き換えます。

    aws lambda update-function-configuration --function-name nodejs_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:nodejs-lodash-layer:1"
  5. 関数を呼び出し、次の AWS CLI コマンドを使用して動作することを確認します。

    aws lambda invoke --function-name nodejs_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{}' response.json

    次のような出力が表示されます。

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    出力 response.json ファイルには、レスポンスに関する詳細が含まれています。

このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウント アカウントに請求される料金の発生を防ぎます。

Lambda レイヤーを削除する方法
  1. Lambda コンソールの [Layers (レイヤー)] ページを開きます。

  2. 作成したレイヤーを選択します。

  3. [削除] を選択したら、[削除] を再度選択します。

Lambda 関数を削除するには
  1. Lambda コンソールの関数ページを開きます。

  2. 作成した関数を選択します。

  3. [アクション] で、[削除] を選択します。

  4. テキスト入力フィールドに confirm と入力し、[Delete] (削除) を選択します。