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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Node.js 构建 Lambda 函数

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

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

Node.js
名称 标识符 SDK 操作系统 弃用日期 阻止函数创建 阻止函数更新

Node.js 20

nodejs20.x

3.362.0

Amazon Linux 2023

Node.js 18

nodejs18.x

3.362.0

Amazon Linux 2

Node.js 16

nodejs16.x

2.1374.0

Amazon Linux 2

2024 年 6 月 12 日

2024 年 7 月 15 日

2024 年 8 月 15 日

注意

Node.js 18 及更高版本的运行时使用Amazon适用于 JavaScript v3 的 SDK。要从较早的运行时迁移函数,请继续关注迁移研讨会 GitHub。有关 JavaScript 版本 3 的 Amazon SDK 的更多信息,请参阅现已正式发布的 JavaScript 模块化 Amazon SDK 博客文章。

创建 Node.js 函数
  1. 打开 Lambda 控制台

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

  3. 配置以下设置:

    • 函数名称:输入函数名称。

    • 运行时系统:选择 Node.js 20.x

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

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

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

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

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

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

注意

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

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

保存函数代码时,Lambda 控制台会创建一个 .zip 文件归档部署包。在控制台外部开发函数代码时(使用 IDE),您需要创建部署程序包将代码上载到 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 日志订阅会调用第二个函数。处理器函数使用Amazon开发工具包收集有关请求的详细信息并将其存储在 Amazon S3 存储桶中。

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

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

Node.js 初始化

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

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

或者,您可以将函数代码指定为 ES 模块,以便在函数处理程序的范围之外,在文件的最顶层使用 await。当您 await 每个 Promise 时,异步初始化代码会在处理程序调用之前完成,从而最大限度地提高预置并发在减少冷启动延迟方面的有效性。有关更多信息和示例,请参阅在 Amazon Lambda 中使用 Node.js ES 模块和顶级等待

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

默认情况下,Lambda 将带有 .js 后缀的文件视为 CommonJS 模块。或者,您可以将您的代码指定为 ES 模块。您可以通过两种方式执行此操作:在函数的 package.json 文件中将 type 指定为 module,或者使用 .mjs 文件扩展名。在第一种方式中,函数代码将所有 .js 文件视为 ES 模块,而在第二种场景中,只有使用 .mjs 指定的文件才是 ES 模块。您可以通过将它们分别命名为 .mjs.cjs 来混合 ES 模块和 CommonJS 模块,因为 .mjs 文件始终是 ES 模块,.cjs 文件始终是 CommonJS 模块。

对于 Node.js 16 及以下的 Node.js 运行时系统版本,Lambda 运行时系统会从与您的函数处理程序相同的文件夹或某个子文件夹中加载 ES 模块。从 Node.js 18 开始,Lambda 会在加载 ES 模块时在 NODE_PATH 环境变量中搜索文件夹。此外,从 Node.js 18 开始,您可以使用 ES 模块 import 语句加载运行时系统中包含的 Amazon 开发工具包。您也可以从加载 ES 模块。

对 TCP 连接使用“保持连接”

默认的 Node.js HTTP/HTTPS 代理会为每个新请求创建一个新的 TCP 连接。为了避免建立新连接的成本,您可以使用重复keepAlive: true使用您的函数使用 Amazon SDK 创建的连接 JavaScript。“保持连接”可以减少使用 SDK 进行多次 API 调用的 Lambda 函数的请求时间。“保持连接”行为因所使用的 SDK 版本而异:

有关使用 keep-alive 的更多信息,请参阅开发者工具博客上的模块化 Amazon SDK 中的 HTTP keep-alive 默认处于 JavaScript开启状态。Amazon

正在加载 CA 证书

对于 Node.js 18 之前的 Node.js 运行时系统版本,Lambda 会自动加载特定于 Amazon 的 CA(证书颁发机构)证书,让您更轻松地创建与其他 Amazon 服务交互的函数。例如,Lambda 包括验证安装在 Amazon RDS 数据库上的服务器身份证书所必需的 Amazon RDS 证书。这种行为可能会对冷启动期间的性能产生影响。

从 Node.js 20 开始,Lambda 默认不再加载其他 CA 证书。Node.js 20 运行时系统包含一个证书文件,其中所有 Amazon CA 证书都位于 /var/runtime/ca-cert.pem。要从 Node.js 18 及更早版本的运行时系统恢复相同的行为,请将 NODE_EXTRA_CA_CERTS 环境变量设置为 /var/runtime/ca-cert.pem

为了获得最佳性能,我们建议仅将所需的证书与部署包捆绑在一起,并通过 NODE_EXTRA_CA_CERTS 环境变量进行加载。证书文件应包含一个或多个 PEM 格式的可信根证书或中间 CA 证书。例如,对于 RDS,将所需的证书与代码一起包含在 certificates/rds.pem。然后,通过将 NODE_EXTRA_CA_CERTS 设置为 /var/task/certificates/rds.pem 来加载证书。