對 Node.js Lambda 函數使用層
使用 Lambda 層封裝要在多個函式之間重複使用的程式碼與相依項。層通常具備程式庫相依性、自訂執行期或組態檔案。建立層包含三個一般步驟:
-
封裝層內容。這表示建立 .zip 封存檔,其中包含您要在函數中使用的相依項。
-
在 Lambda 中建立層。
-
將層新增至函數中。
封裝層內容
若要建立層,請將套件封裝成符合以下要求的 .zip 壓縮檔:
-
使用計劃用於 Lambda 函式的同一個 Node.js 版本來建置層。例如,若透過 Node.js 22 建置層,需使用適用於函式的 Node.js 22 執行時期。
-
層的 .zip 檔案必須使用下列任一目錄結構:
-
nodejs/node_modules -
nodejs/node(其中X/node_modulesX為 Node.js 版本,例如node22)
如需更多詳細資訊,請參閱 每個 Lambda 執行時間的層路徑。
-
-
層中的套件必須與 Linux 相容。Lambda 函式會在 Amazon Linux 上執行。
您可以建立包含透過 npm 安裝的第三方 Node.js 程式庫 (如 axios 或 lodash) 的層,或您自訂的 JavaScript 模組的層。
使用 npm 套件建立層
-
建立必要的目錄結構,並將套件直接安裝至其中:
mkdir -p nodejs npm install --prefix nodejs lodash axios此命令會將套件直接安裝至
nodejs/node_modules目錄,該目錄結構為 Lambda 所需的格式。 -
壓縮層內容:
.zip 檔案的目錄結構應如下所示:
nodejs/ ├── package.json ├── package-lock.json └── node_modules/ ├── lodash/ ├── axios/ └── (dependencies of the other packages)注意
請確保 .zip 檔案在根層級包含
nodejs目錄,且該目錄內含node_modules子目錄。此結構可確保 Lambda 能順利找到並匯入套件。-
npm 將
nodejs/目錄中的package.json和package-lock.json檔案用於相依項管理,但 Lambda 實現層功能時並不需要這些檔案。每個已安裝的套件皆包含其自身的package.json檔案,該檔案定義了 Lambda 匯入套件的方式。
使用自訂的程式碼建立層
-
建立層所需的目錄結構:
mkdir -p nodejs/node_modules/validator cd nodejs/node_modules/validator -
為自訂模組建立
package.json檔案,定義其匯入的方式:範例 nodejs/node_modules/validator/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 Developer Guide GitHub 儲存庫中的 layer-nodejs