我如何使用层将 AWS SDK for JavaScript 的最新版本集成到我的 Node.js Lambda 函数?

3 分钟阅读
0

AWS Lambda 运行时环境没有 AWS SDK 最新版本中的某些功能。我想将 AWS SDK for JavaScript 的最新版本集成到我的 Node.js Lambda 函数。

简述

要将最新版本的 AWS SDK 集成到 Lambda 函数的部署包,创建一个 Lambda 层。然后,将该层添加到函数中。要创建 Lambda 层并将其添加到您的函数中,使用 AWS 命令行界面 (AWS CLI)Lambda 控制台

**注意:**对于 Node.js 版本 16 及更早版本,Lambda Node.js 运行时包括 AWS SDK for JavaScript 版本 2。对于 Node.js 版本 18 及更高版本,Lambda Node.js 运行时包括了 AWS SDK for JavaScript 版本 3。有关更多信息,请参阅 AWS Lambda 现已支持 Node.js 18.x 运行时

有关 Lambda 使用的运行时和 AWS SDK 版本的完整列表,请参阅 Lambda 运行时

**注意:**以下解决方法会增加函数部署包的大小。有关 Lambda 存储配额的信息,请参阅 Lambda 配额

解决方法

**注意:**如果您在运行 AWS 命令行界面 (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)

    请参阅安装 SDK for JavaScript

    如果您导入的 AWS SDK 命令在 Lambda 中嵌入的 SDK 版本中不存在,您可能会收到以下错误:

    “Runtime.UserCodeSyntaxError "未找到命名导出" 请求的模块是 CommonJS 模块”

    在这种情况下,安装特定软件包,以可以在函数中使用。例如,您可以使用下列导入语句:

    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: 未找到命名导出 'DeleteQueueCommand'。请求的模块 '@aws-sdk/client-connect' 是 CommonJS 模块,可能不支持作为命名导出导出所有模块。CommonJS 模块始终可以通过默认导出来导入,例如,使用 '@aws-sdk/client-connect';\nconst {DeleteQueueCommand} = pkg 中的导入包"。”

    要包含 DeleteQueueCommand 软件包并解决此错误,请安装最新版本的客户端:

    npm install @aws-sdk/client-connect  
    
  4. 创建一个 .zip 文件来上传到您的 Lambda 层:

    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 的更改日志文件中验证 AWS SDK 的最新版本。有关更多信息,请参阅 GitHub 网站上的 AWS SDK for JavaScript 的变更日志AWS SDK V3 for Javascript 的变更日志

相关信息

Lambda 编程模型

使用 AWS Lambda 函数的最佳实践

如何为 Node.js 构建 Lambda 部署包?

AWS 官方
AWS 官方已更新 7 个月前