對 Node.js Lambda 函數使用層 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

對 Node.js Lambda 函數使用層

使用 Lambda 層來封裝您要在多個函數之間重複使用的程式碼和相依性。層通常具備程式庫相依性、自訂執行期或組態檔案。建立層包含三個一般步驟:

  1. 封裝層內容。這表示建立 .zip 封存檔,其中包含您要在函數中使用的相依項。

  2. 在 Lambda 中建立層。

  3. 將層新增至函數中。

封裝層內容

若要建立 layer,請將套件綁定到符合下列要求的 .zip 檔案封存中:

  • 使用您計劃用於 Lambda 函數的相同 Node.js 版本建置 layer。例如,如果您使用 Node.js 22 建置 layer,請使用 Node.js 22 執行時間做為函數。

  • 您 layer 的 .zip 檔案必須使用下列其中一個目錄結構:

    • nodejs/node_modules

    • nodejs/nodeX/node_modules (其中 X 是 Node.js 版本,例如 node22)

    如需詳細資訊,請參閱每個 Lambda 執行時間的層路徑

  • 層中的套件必須與 Linux 相容。Lambda 函數會在 Amazon Linux 上執行。

您可以建立包含搭配 npm(例如 axioslodash) 或自有 JavaScript 模組安裝之第三方 Node.js 程式庫的層。

使用 npm 套件建立圖層
  1. 建立所需的目錄結構,並將套件直接安裝到其中:

    mkdir -p nodejs npm install --prefix nodejs lodash axios

    此命令會將套件直接安裝至 nodejs/node_modules目錄,這是 Lambda 所需的結構。

    注意

    對於具有原生相依性或二進位元件 (例如利或 Bcrypt) 的套件,請確保它們與 Lambda Linux 環境和函數的架構相容。您可能需要使用 --platform旗標:

    npm install --prefix nodejs --platform=linux --arch=x64 sharp

    對於更複雜的原生相依性,您可能需要在符合 Lambda 執行期的 Linux 環境中進行編譯。您可以將 Docker 用於此目的。

  2. 壓縮圖層內容:

    Linux/macOS
    zip -r layer.zip nodejs/
    PowerShell
    Compress-Archive -Path .\nodejs -DestinationPath .\layer.zip

    .zip 檔案的目錄結構看起來應該如下所示:

    nodejs/
    ├── package.json
    ├── package-lock.json
    └── node_modules/
        ├── lodash/
        ├── axios/
        └── (dependencies of the other packages)
    注意
    • 請確定您的 .zip 檔案包含根層級的 nodejs目錄,node_modules其中包含其中的 。此結構可確保 Lambda 可以尋找和匯入套件。

    • nodejs/ 目錄中的 package.jsonpackage-lock.json 檔案由 npm 用於相依性管理,但 Lambda 不需要用於層功能。每個已安裝的套件都已包含自己的package.json檔案,定義 Lambda 匯入套件的方式。

使用您自己的程式碼建立 layer
  1. 為您的 layer 建立所需的目錄結構:

    mkdir -p nodejs/node_modules/validator cd nodejs/node_modules/validator
  2. 為您的自訂模組建立 package.json 檔案,以定義匯入的方式:

    範例 nodejs/node_modules/validator/package.json
    { "name": "validator", "version": "1.0.0", "type": "module", "main": "index.mjs" }
  3. 建立 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) }; }
  4. 壓縮圖層內容:

    Linux/macOS
    zip -r layer.zip nodejs/
    PowerShell
    Compress-Archive -Path .\nodejs -DestinationPath .\layer.zip

    .zip 檔案的目錄結構看起來應該如下所示:

    nodejs/              
    └── node_modules/
        └── validator/
            ├── package.json
            └── index.mjs
  5. 在您的函數中,匯入並使用模組。範例:

    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。

AWS CLI

執行 publish-layer-version AWS CLI 命令來建立 Lambda layer:

aws lambda publish-layer-version --layer-name my-layer --zip-file fileb://layer.zip --compatible-runtimes nodejs22.x

相容的執行時間參數是選用的。指定時,Lambda 會使用此參數來篩選 Lambda 主控台中的圖層。

Console
建立圖層 (主控台)
  1. 開啟 Lambda 主控台中的 層頁面

  2. 選擇 建立圖層

  3. 選擇上傳 .zip 檔案,然後上傳您先前建立的 .zip 封存檔。

  4. (選用) 對於相容的執行時間,選擇對應於您用來建置 layer 的 Node.js 版本的 Node.js 執行時間。

  5. 選擇建立

將 layer 新增至函數

AWS CLI

若要將 layer 連接至函數,請執行 update-function-configuration AWS CLI 命令。對於 --layers 參數,請使用 layer ARN。ARN 必須指定版本 (例如 arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1)。如需詳細資訊,請參閱層和層的版本

aws lambda update-function-configuration --function-name my-function --cli-binary-format raw-in-base64-out --layers "arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1"

如果您使用的是第 2 AWS CLI 版,則需要 cli-binary-format選項。若要讓此成為預設的設定,請執行 aws configure set cli-binary-format raw-in-base64-out。若要取得更多資訊,請參閱《AWS Command Line Interface 使用者指南第 2 版》AWS CLI 支援的全域命令列選項

Console
將圖層新增至函數
  1. 開啟 Lambda 主控台中的函數頁面

  2. 選擇 函數。

  3. 向下捲動至區段,然後選擇新增層

  4. 選擇圖層下,選取自訂圖層,然後選擇您的圖層。

    注意

    如果您在建立 layer 時未新增相容的執行時間,您的 layer 將不會列在此處。您可以改為指定 layer ARN。

  5. 選擇新增

範例應用程式

如需如何使用 Lambda 層的更多範例,請參閱《 AWS Lambda 開發人員指南 GitHub 儲存庫》中的 layer-nodejs 範例應用程式。此應用程式包含包含 lodash 程式庫的 layer。建立 layer 之後,您可以部署和叫用對應的 函數,以確認 layer 如預期般運作。