Node.js Lambda 関数のレイヤーを操作する
Lambda レイヤーを使用して、複数の関数間で再利用するコードおよび依存関係をパッケージ化できます。レイヤーには通常、ライブラリの依存関係、カスタムランタイム、または設定ファイルが含まれています。レイヤーの作成には、次の 3 つの一般的な手順が含まれます。
-
レイヤーコンテンツのパッケージ化。これは、関数で使用する依存関係を含む .zip ファイルアーカイブを作成することを意味します。
-
Lambda でレイヤーを作成します。
-
レイヤーを関数に追加します。
レイヤーコンテンツのパッケージ化
レイヤーを作成するには、次の要件を満たす .zip ファイルのアーカイブにパッケージをバンドルします。
-
Lambda 関数に使用するのと同じ Node.js バージョンを使用してレイヤーを構築します。例えば、Node.js 22 を使用してレイヤーを構築する場合、関数に Node.js 22 ランタイムを使用してください。
-
Layer の .zip ファイルは、次のいずれかのディレクトリ構造を使用する必要があります。
-
nodejs/node_modules
-
nodejs/node
(X
/node_modulesX
は Node.js バージョン。例:node22
)
詳細については、「各 Lambda ランタイムのレイヤーパス」を参照してください。
-
-
レイヤーのパッケージは Linux と互換性がある必要があります。Lambda 関数は Amazon Linux 上で動作します。
-
レイヤーにネイティブバイナリまたは実行可能ファイルが含まれている場合は、関数と同じアーキテクチャ (x86_64 または arm64) をターゲットにする必要があります。
npm
がインストールされたサードパーティ Node ライブラリ (axios
や lodash
など) か、ユーザー独自の JavaScript モジュールやパッケージのいずれかを含むレイヤーを作成できます。
npm パッケージを使用してレイヤーを作成する方法
-
必要なディレクトリ構造を作成し、パッケージを直接インストールします。
mkdir -p nodejs npm install --prefix nodejs lodash axios
このコマンドは、Lambda が必要とする構造である
nodejs/node_modules
ディレクトリにパッケージを直接インストールします。 -
レイヤーコンテンツを圧縮します。
.zip ファイルのディレクトリ構造は次のようになります。
nodejs/ └── node_modules/ ├── lodash/ ├── axios/ └── (dependencies of the other packages)
注記
zip ファイルには、ルートレベルに
nodejs
ディレクトリを含み、その中にnode_modules
ディレクトリがあることを確認してください。この構造により、Lambda がパッケージを検出し、インポートできます。
ユーザー独自のコードを使用してレイヤーを作成する方法
-
レイヤーに必要なディレクトリ構造を作成します。
mkdir -p nodejs/node_modules/validator
-
独自のモジュールをインポートする方法を定義するため、
package.json
ファイルを作成します。例 package.json
{ "name": "validator", "version": "1.0.0", "type": "module", "main": "index.mjs" }
-
JavaScript モジュール ファイルを作成します。
例 nodejs/node_modules/validator/index.mjs
export function validateOrder(orderData) { // Validates an order and returns formatted data const requiredFields = ['productId', 'quantity']; // Check required fields const missingFields = requiredFields.filter(field => !(field in orderData)); if (missingFields.length > 0) { throw new Error(`Missing required fields: ${missingFields.join(', ')}`); } // Validate quantity const quantity = orderData.quantity; if (!Number.isInteger(quantity) || quantity < 1) { throw new Error('Quantity must be a positive integer'); } // Format and return the validated data return { productId: String(orderData.productId), quantity: quantity, shippingPriority: orderData.priority || 'standard' }; } export function formatResponse(statusCode, body) { // Formats the API response return { statusCode: statusCode, body: JSON.stringify(body) }; }
-
レイヤーコンテンツを圧縮します。
.zip ファイルのディレクトリ構造は次のようになります。
nodejs/ └── node_modules/ └── validator/ ├── package.json └── index.mjs
-
関数内でモジュールをインポートして使用します。例:
import { validateOrder, formatResponse } from 'validator'; export const handler = async (event) => { try { // Parse the order data from the event body const orderData = JSON.parse(event.body || '{}'); // Validate and format the order const validatedOrder = validateOrder(orderData); return formatResponse(200, { message: 'Order validated successfully', order: validatedOrder }); } catch (error) { if (error instanceof Error && error.message.includes('Missing required fields')) { return formatResponse(400, { error: error.message }); } return formatResponse(500, { error: 'Internal server error' }); } };
次のテストイベントを使用して関数を呼び出すことができます。
{ "body": "{\"productId\": \"ABC123\", \"quantity\": 2, \"priority\": \"express\"}" }
予想されるレスポンス
{ "statusCode": 200, "body": "{\"message\":\"Order validated successfully\",\"order\":{\"productId\":\"ABC123\",\"quantity\":2,\"shippingPriority\":\"express\"}}" }
Lambda でレイヤーを作成する
AWS CLI または Lambda コンソールを使用して、レイヤーを発行できます。
レイヤーを関数に追加する
サンプルアプリ
Lambda レイヤーの使用方法のその他の例については、「AWS Lambda デベロッパーガイド」の GitHub リポジトリ内の layer-nodejs