本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
對 Node.js Lambda 函數使用層
使用 Lambda 層來封裝您要在多個函數之間重複使用的程式碼和相依性。層通常具備程式庫相依性、自訂執行期或組態檔案。建立層包含三個一般步驟:
-
封裝層內容。這表示建立 .zip 封存檔,其中包含您要在函數中使用的相依項。
-
在 Lambda 中建立層。
-
將層新增至函數中。
封裝層內容
若要建立 layer,請將套件綁定到符合下列要求的 .zip 檔案封存中:
-
使用您計劃用於 Lambda 函數的相同 Node.js 版本建置 layer。例如,如果您使用 Node.js 22 建置 layer,請使用 Node.js 22 執行時間做為函數。
-
您 layer 的 .zip 檔案必須使用下列其中一個目錄結構:
-
nodejs/node_modules
-
nodejs/node
(其中X
/node_modulesX
是 Node.js 版本,例如node22
)
如需詳細資訊,請參閱每個 Lambda 執行時間的層路徑。
-
-
層中的套件必須與 Linux 相容。Lambda 函數會在 Amazon Linux 上執行。
您可以建立包含搭配 npm
(例如 axios
或 lodash
) 或自有 JavaScript 模組安裝之第三方 Node.js 程式庫的層。
使用 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 可以尋找和匯入套件。-
nodejs/
目錄中的package.json
和package-lock.json
檔案由 npm 用於相依性管理,但 Lambda 不需要用於層功能。每個已安裝的套件都已包含自己的package.json
檔案,定義 Lambda 匯入套件的方式。
使用您自己的程式碼建立 layer
-
為您的 layer 建立所需的目錄結構:
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 中建立 layer
您可以使用 AWS CLI 或 Lambda 主控台發佈 layer。
將 layer 新增至函數
範例應用程式
如需如何使用 Lambda 層的更多範例,請參閱《 AWS Lambda 開發人員指南 GitHub 儲存庫》中的 layer-nodejs