使用 Node.js 构建 Lambda 函数 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用 Node.js 构建 Lambda 函数

您可以使用 Node.js 在 Amazon Lambda 中运行 JavaScript 代码。Lambda 可为 Node.js 提供运行时,用于运行代码来处理事件。您的代码在包含 Amazon SDK for JavaScript 的环境中运行,其中包含来自您管理的 Amazon Identity and Access Management (IAM) 角色的凭证。

Lambda 支持以下 Node.js 运行时。

Node.js 运行时
名称 标识符 适用于 JavaScript 的开发工具包 操作系统 架构

Node.js 14

nodejs14.x

2.1001.0

Amazon Linux 2

x86_64,arm64

Node.js 12

nodejs12.x

2.1001.0

Amazon Linux 2

x86_64,arm64

Node.js 10

nodejs10.x

2.1001.0

Amazon Linux 2

x86_64

注意

有关 Node.js 10 的支持终止信息,请参阅 运行时支持策略

Lambda 函数使用执行角色获得将日志写入 Amazon CloudWatch Logs 以及访问其他服务和资源的权限。如果您还没有函数开发的执行角色,请创建一个。

创建执行角色

  1. 在 IAM 控制台中,打开 Roles(角色)页面

  2. 选择创建角色

  3. 创建具有以下属性的角色。

    • Trusted entity(可信任的实体)– Lambda

    • Permissions(权限)– AWSLambdaBasicExecutionRole

    • Role name(角色名称)– lambda-role

    AWSLambdaBasicExecutionRole 策略具有函数将日志写入 CloudWatch Logs 所需的权限。

您可以稍后向此角色添加权限,或将其与特定于单一函数的其他角色交换。

创建 Node.js 函数

  1. 打开 Lambda 控制台

  2. 选择 Create function(创建函数)。

  3. 配置以下设置:

    • 名称my-function.

    • 运行时Node.js 14.x

    • Role(角色)– Choose an existing role(选择现有角色)。

    • Existing role(现有角色)– lambda-role

  4. 选择 Create function(创建函数)。

  5. 要配置测试事件,请选择测试

  6. 对于事件名称,输入 test

  7. 选择 Save changes(保存更改)。

  8. 要调用该函数,请选择 Test(测试)。

控制台将使用名为 index.js 的源文件创建一个 Lambda 函数。您可以在内置代码编辑器中编辑此文件并添加更多文件。要保存您的更改,请选择 Save(保存)。然后,要运行代码,请选择 Test(测试)。

注意

Lambda 控制台使用 Amazon Cloud9 在浏览器中提供集成开发环境。您还可以使用 Amazon Cloud9 在您自己的环境中开发 Lambda 函数。有关更多信息,请参阅 Amazon Cloud9 用户指南中的使用 Lambda 函数

index.js 文件会导出一个名为 handler 的函数,此函数将接受事件对象和上下文对象。这是 Lambda 在调用函数时调用的处理函数。Node.js 函数运行时从 Lambda 获取调用事件并将其传递到处理程序。在函数配置中,处理程序值为 index.handler

保存函数代码时,Lambda 控制台会创建一个 .zip 文件归档部署包。在控制台外部开发函数代码时(使用 SDE),您需要创建部署程序包将代码上载到 Lambda 函数。

注意

要在本地环境中开始应用程序开发,请部署本指南的 GitHub 存储库中提供的其中一个示例应用程序。

Node.js 中的示例 Lambda 应用程序

  • blank-nodejs – 此 Node.js 函数用于显示日志记录、环境变量、Amazon X-Ray 跟踪、层、单元测试以及Amazon开发工具包的使用情况。

  • nodejs-apig – 一个带有公有 API 端点的函数,此函数可处理来自 API Gateway 的事件并返回 HTTP 响应。

  • rds-mysql – 此函数可将查询中继到 MySQL for RDS 数据库。此示例包括在 Amazon Secrets Manager 中配置了密码的私有 VPC 和数据库实例。

  • efs-nodejs – 此函数可在 Amazon VPC 中使用 Amazon EFS 文件系统。此示例包括配置为与 Lambda 一起使用的 VPC、文件系统、挂载目标和访问点。

  • list-manager – 此函数可处理来自 Amazon Kinesis 数据流的事件并更新 Amazon DynamoDB 中的聚合列表。该函数会将每个事件的记录存储在私有 VPC 中的 MySQL for RDS 数据库中。此示例包括一个私有 VPC 以及一个适用于 DynamoDB 的 VPC 终端节点和一个数据库实例。

  • error-processor – 此 Node.js 函数可为指定百分比的请求生成错误。记录错误时,CloudWatch Logs 订阅会调用第二个函数。处理器函数使用Amazon开发工具包收集有关请求的详细信息并将其存储在 Amazon S3 存储桶中。

除了调用事件之外,函数运行时还将上下文对象传递给处理程序。上下文对象包含有关调用、函数和执行环境的其他信息。环境变量中提供了更多信息。

您的 Lambda 函数附带了 CloudWatch Logs 日志组。函数运行时会将每次调用的详细信息发送到 CloudWatch Logs。该运行时会中继调用期间函数输出的任何日志。如果您的函数返回错误,则 Lambda 将为错误设置格式,并将其返回给调用方。

Node.js 初始化

Node.js 使用独有的事件循环模型,导致其初始化行为与其他运行时不同。具体来说,Node.js 使用支持异步操作的非阻止式 I/O 模型。此模型允许 Node.js 高效地执行大多数工作负载。例如,假设 Node.js 函数进行网络调用,则该请求可能会被指定为异步操作并放入回调队列中。函数可能会继续处理主调用堆栈内的其他操作,而不会因等待网络调用返回而被阻止。返回网络调用后,将会执行对它的回调,然后从回调队列中删除。

某些初始化任务可能会异步运行。这些异步任务不能保证在调用之前完成执行。例如,在 Lambda 执行处理函数时,进行网络调用以从 Amazon 参数存储中获取参数的代码可能尚未完成。因此在调用过程中,变量可能为空。为避免这种情况,请首先确保变量和其他异步代码已完全初始化,然后再继续使用函数的其余核心业务逻辑。

将函数处理程序指定为 ES 模块

从 Node 14 开始,您可以通过将代码指定为 ES 模块并使用顶层等待(top-level await)来保证在处理程序调用之前完成异步初始化代码。预设情况下,软件包被指定为 CommonJS 模块,这意味着您必须首先将函数代码指定为 ES 模块才能使用顶层等待。您可以通过两种方式执行此操作:在函数的 package.json 文件将 type 指定为 module,或者使用 .mjs 文件扩展名。

在第一种场景中,函数代码将所有 .js 文件视为 ES 模块,而在第二种场景中,只有使用 .mjs 指定的文件才是 ES 模块。您可以通过将它们分别命名为 .mjs 和 .cjs 来混合 ES 模块和 CommonJS 模块,因为 .mjs 文件始终是 ES 模块,.cjs 文件始终是 CommonJS 模块。

有关更多信息和示例,请参阅在 Amazon Lambda 中使用 Node.js ES 模块和顶层等待