使用 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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
名称 | 标识符 | SDK | 操作系统 | 架构 | 弃用(阶段 1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Node.js 18 |
|
3.188.0 |
Amazon Linux 2 |
x86_64,arm64 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Node.js 16 |
|
2.1083.0 |
Amazon Linux 2 |
x86_64,arm64 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Node.js 14 |
|
2.1055.0 |
Amazon Linux 2 |
x86_64,arm64 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Node.js 12 |
|
2.1055.0 |
Amazon Linux 2 |
x86_64,arm64 |
2023 年 3 月 31 日 |
注意
Node 18 运行时使用 JavaScript v3 的 Amazon 开发工具包。要将函数从较早的运行时迁移到 Node 18,请关注 GitHub 上的 migration workshop
Lambda 函数使用执行角色获得将日志写入 Amazon CloudWatch Logs 以及访问其他服务和资源的权限。如果您还没有函数开发的执行角色,请创建一个。
创建执行角色
-
在 IAM 控制台中,打开 Roles(角色)页面
。 -
选择 Create role(创建角色)。
-
创建具有以下属性的角色。
-
Trusted entity(可信任的实体)– Lambda。
-
Permissions(权限)– AWSLambdaBasicExecutionRole。
-
Role name(角色名称)–
lambda-role
。
AWSLambdaBasicExecutionRole 策略具有函数将日志写入 CloudWatch Logs 所需的权限。
-
您可以稍后向此角色添加权限,或将其与特定于单一函数的其他角色交换。
创建 Node.js 函数
-
打开 Lambda 控制台
。 -
选择 Create function(创建函数)。
-
配置以下设置:
-
名称 –
my-function
. -
运行时 – Node.js 18.x。
-
Role(角色)– Choose an existing role(选择现有角色)。
-
Existing role(现有角色)–
lambda-role
。
-
-
选择 Create function(创建函数)。
-
要配置测试事件,请选择测试。
-
对于事件名称,输入
test
。 -
选择 Save changes(保存更改)。
-
要调用该函数,请选择 Test(测试)。
控制台使用名为 index.js
或 index.mjs
的单个源文件创建一个 Lambda 函数。您可以在内置代码编辑器中编辑此文件并添加更多文件。要保存您的更改,请选择 Save(保存)。然后,要运行代码,请选择 Test(测试)。
注意
Lambda 控制台使用 Amazon Cloud9 在浏览器中提供集成开发环境。您还可以使用 Amazon Cloud9 在您自己的环境中开发 Lambda 函数。有关更多信息,请参阅 Amazon Cloud9 用户指南中的使用 Lambda 函数。
该 index.js
或 index.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 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 模块,以便在函数处理程序的范围之外,在文件的最顶层使用 await
。当您 await
每个 Promise
时,异步初始化代码会在处理程序调用之前完成,从而最大限度地提高预置并发在减少冷启动延迟方面的有效性。有关更多信息和示例,请参阅 Using Node.js ES modules and top-level await in Amazon Lambda
将函数处理程序指定为 ES 模块
默认情况下,Lambda 将带有 .js
后缀的文件视为 CommonJS 模块。或者,您可以将您的代码指定为 ES 模块。您可以通过两种方式执行此操作:在函数的 package.json
文件中将 type
指定为 module
,或者使用 .mjs
文件扩展名。在第一种方式中,函数代码将所有 .js
文件视为 ES 模块,而在第二种场景中,只有使用 .mjs
指定的文件才是 ES 模块。您可以通过将它们分别命名为 .mjs
和 .cjs
来混合 ES 模块和 CommonJS 模块,因为 .mjs
文件始终是 ES 模块,.cjs
文件始终是 CommonJS 模块。
在 Node.js 14 和 Node.js 16 中,Lambda 运行时从与您的函数处理程序相同的文件夹或子文件夹中加载 ES 模块。从 Node.js 18 开始,Lambda 在加载 ES 模块时在 NODE_PATH
环境变量中搜索文件夹。通过 Node.js 18,您可以使用 ES 模块 import
语句加载运行时中包含的 Amazon 开发工具包。您也可以从层加载 ES 模块。