如何使用層將適用於 JavaScript 的 AWS SDK 最新版本整合到我的 Node.js Lambda 函數中?

3 分的閱讀內容
0

AWS Lambda 執行時期環境沒有 AWS SDK 最新版本的某些功能。我想要將適用於 JavaScript 的 AWS SDK 最新版本整合到我的 Node.js Lambda 函數中。

簡短描述

若要將最新版本的 AWS SDK 整合到 Lambda 函數的部署套件中,請建立 Lambda 層。然後,將該層新增到您的函數中。若要建立 Lambda 層並將其新增至您的函數,請使用 AWS Command Line Interface (AWS CLI)Lambda 主控台

**注意事項:**對於 Node.js 第 16 版及更舊版本,Lambda Node.js 執行時期包括適用於 JavaScript 的 AWS SDK 第 2 版。對於 Node.js 第 18 版及更新版本,Lambda Node.js 執行時期包括適用於 JavaScript 的 AWS SDK 第 3 版。如需詳細資訊,請參閱 Node.js 18.x 執行時期現在可用於 AWS Lambda

如需 Lambda 使用的執行時間和 AWS SDK 版本的完整清單,請參閱 Lambda 執行時期

**注意事項:**下列解決方案會增加函數部署套件的大小。如需 Lambda 儲存配額的資訊,請參閱 Lambda 配額

解決方案

**注意事項:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

(選用) 確認您的函數使用的 AWS SDK 版本

若要確認您的函數使用的 AWS SDK 版本,請完成下列步驟:

**注意事項:**僅對 Node.js 第 16 版及更舊版本使用此方法。 

  1. 在 Lambda 主控台中建立函數

  2. 更新函數的程式碼,以傳回在您調用函數時該函數會使用的 AWS SDK 版本:

    const AWS = require('aws-sdk')   
    exports.handler = async (event) => {  
    return AWS.VERSION;  
    };
  3. 調用您的函數

  4. 比較函數傳回的 AWS SDK 版本與 AWS SDK 文件中列出的 AWS SDK 最新版本。

安裝和封裝最新版本的 AWS SDK

**注意事項:**部署套件必須與您使用的 Lambda 執行時期相容。最佳實踐是對 Lambda 執行時期中指定的執行時期使用相同的作業系統 (OS)。例如,啟動相容的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。

在與 Lambda 相容的本機開發環境中,完成下列步驟:

  1. 執行下列命令以建立工作目錄:

    mkdir -p aws-sdk-layer/nodejs
  2. 執行下列命令以變更至工作目錄:

    cd aws-sdk-layer/nodejs
  3. 為 Node.js 執行時期版本安裝 AWS SDK:
    Node.js 16 及更舊版本 (AWS SDK 第 2 版)
    若要安裝最新版本的 AWS SDK 第 2 版,請使用 Amazon Linux 2 相容執行個體執行下列命令:

    npm install aws-sdk

    如需詳細資訊,請參閱教學課程: 在 Amazon EC2 執行個體上設定 Node.js

    **注意事項:**最佳實踐是在開發 Lambda 資源時,使用 Amazon Linux 2 環境。

    -或-

    如果您使用 Windows 或 macOS 作業系統進行開發,請使用 Docker 執行下列命令:

    docker run --entrypoint "" -v "$PWD":/var/task "public.ecr.aws/lambda/nodejs:<version>" /bin/sh -c "npm install aws-sdk; exit"

    **注意事項:**在執行命令之前,請確定您使用的是 Docker 網站上最新版本的 Docker

    Node.js 18 及更新版本 (AWS SDK 第 3 版)

    請參閱安裝 JavaScript 的 SDK

    如果您匯入內嵌於 Lambda 的 SDK 版本中不存在的 AWS SDK 命令,可能會收到下列錯誤:

    「Runtime.UserCodeSyntaxError "Named export not found" The requested module is a CommonJS module」

    在這種情況下,請安裝特定的套件以便在函數中使用。例如,您使用下列匯入陳述式:

    import {DeleteQueueCommand} from "@aws-sdk/client-connect";

    在這種情況下,請安裝更新的用戶端,以便您可以在函數中使用特定的套件。

    例如,您在具有 Node.js 第 18 版或更新版本的 Lambda 函數中使用下列匯入陳述式:

    import {DeleteQueueCommand} from "@aws-sdk/client-connect";

    如果此套件不在您目前的 AWS SDK 版本中,則您會在日誌中收到下列錯誤:

    「"errorType": "Runtime.UserCodeSyntaxError",
    "errorMessage": "SyntaxError: Named export 'DeleteQueueCommand' not found.The requested module '@aws-sdk/client-connect' is a CommonJS module, which may not support all module.exports as named exports.\nCommonJS modules can always be imported via the default export, for example using:\n\nimport pkg from '@aws-sdk/client-connect';\nconst {DeleteQueueCommand} = pkg;\n",」

    若要包含 DeleteQueueCommand 套件並解決此錯誤,請安裝最新版本的用戶端:

    npm install @aws-sdk/client-connect  
    
  4. 建立要上傳至 Lambda 層的 .zip 檔案:

    zip -r ../package.zip ../
  5. (選用) 驗證您安裝的 AWS SDK 版本:

    cat package-lock.json

    您會收到類似於下列範例的輸出:

    {  "requires": true,  
      "lockfileVersion": 1,  
      "dependencies": {  
        "aws-sdk": {  
          "version": "2.888.0",  
    ...

使用 AWS CLI 來建立 Lambda 層並將其新增至您的函數

  1. 若要建立包含您想要使用的最新 AWS SDK 版本的新 Lambda 層,請執行下列 publish-layer-version 命令:

    **注意事項:**將 node_sdk 取代為層的名稱,並且將 My layer 取代為層的描述。此外,將 compatible-runtimes 值取代為您使用的執行時期,並且將 region 取代為您的函數和層所在的 AWS 區域。

    aws lambda publish-layer-version --layer-name node_sdk --description "My layer" --license-info "MIT" --compatible-runtimes --zip-file fileb://../package.zip --region

    記下命令輸出中的 LayerVersionArn 值以在下一步中使用。

  2. 若要將層新增至函數中,請執行下列 update-function-configuration 命令:

    注意事項:my-function 取代為您的函數名稱、將 arn:aws:lambda:us-east-2:123456789012:layer:node_sdk:1 取代為輸出中的 LayerVersionArn 值,並且將 region 取代為您的區域。

    aws lambda update-function-configuration --function-name my-function --layers arn:aws:lambda:us-east-2:123456789012:layer:node_sdk:1 --region

    如需詳細資訊,請參閱使用 Lambda 層

使用 Lambda 主控台來建立 Lambda 層並將其新增至您的函數

  1. 在 Lambda 主控台中開啟層頁面
  2. 選擇建立層。然後,輸入下列值:
    對於名稱,輸入新層的名稱。
    (選用) 對於描述 - 選用,輸入層的描述。
    選擇上傳 .zip 檔案
    選擇上傳。然後,選擇部署套件 .zip 檔案的名稱。
    (選用) 對於相容的執行時期 - 選用,選擇一個或多個相容的執行時期。 
    (選用) 對於授權 - 選用,輸入層的任何適用軟體授權資訊。
  3. 選擇建立
  4. 在 Lambda 主控台中開啟函數頁面,然後選擇您想要將層新增至其中的函數名稱。
  5. 函數概觀下方,選擇
  6. 選擇新增層
  7. 選擇層下,選擇自訂層。然後,選擇下列值:
    層的名稱
    層的版本
  8. 選擇新增

(選用) 測試設定

完成 (選用) 確認函數使用的 AWS SDK 版本區段中的步驟來調用您的函數。該函數會傳回其使用的 AWS SDK 版本。

您也可以在您使用的 AWS SDK 的 CHANGELOG 檔案中驗證最新版本的 AWS SDK。如需詳細資訊,請參閱 GitHub 網站上的適用於 JavaScript 的 AWS SDK 的變更日誌適用於 JavaScript 的 AWS SDK 第 3 版的變更日誌

相關資訊

Lambda 程式設計模型 

使用 AWS Lambda 函數的最佳實踐

如何建置 Node.js 的 Lambda 部署套件?

AWS 官方
AWS 官方已更新 4 個月前