

# 使用 Node.js 构建 Lambda 函数
<a name="lambda-nodejs"></a>

您可以使用 Node.js 在 AWS Lambda 中运行 JavaScript 代码。Lambda 可为 Node.js 提供[运行时](lambda-runtimes.md)，用于运行代码来处理事件。您的代码在包含 适用于 JavaScript 的 AWS SDK 的环境中运行，其中包含来自您管理的 AWS Identity and Access Management (IAM) 角色的凭证。要了解有关 Node.js 运行时随附的 SDK 版本的更多信息，请参阅 [包含运行时的 SDK 版本](#nodejs-sdk-included)。

Lambda 支持以下 Node.js 运行时。<a name="nodejs-supported-runtimes"></a>


| 名称 | 标识符 | 操作系统 | 弃用日期 | 阻止函数创建 | 阻止函数更新 | 
| --- | --- | --- | --- | --- | --- | 
| Node.js 24 | `nodejs24.x` | Amazon Linux 2023 |  2028 年 4 月 30 日  |  2028 年 6 月 1 日  |  2028 年 7 月 1 日  | 
| Node.js 22 | `nodejs22.x` | Amazon Linux 2023 |  2027 年 4 月 30 日  |  2027 年 6 月 1 日  |  2027 年 7 月 1 日  | 
| Node.js 20 | `nodejs20.x` | Amazon Linux 2023 |  2026 年 4 月 30 日  |  2026 年 8 月 31 日  |  Sep 30, 2026  | 

**创建 Node.js 函数**

1. 打开 [Lambda 控制台](https://console.aws.amazon.com/lambda)。

1. 选择 **Create function**（创建函数）。

1. 配置以下设置：
   + **函数名称**：输入函数名称。
   + **运行时系统**：选择 **Node.js 24.x**。

1. 选择**创建函数**。

控制台将使用名为 `index.mjs` 的源文件创建一个 Lambda 函数。您可以在内置代码编辑器中编辑此文件并添加更多文件。在**部署**部分，选择**部署**以更新函数的代码。然后，要运行您的代码，请在**测试事件**部分中选择**创建测试事件**。

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

保存函数代码时，Lambda 控制台会创建一个 .zip 文件归档部署包。在控制台外部开发函数代码时（使用 IDE），您需要[创建部署程序包](nodejs-package.md)将代码上载到 Lambda 函数。

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

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

**Topics**
+ [包含运行时的 SDK 版本](#nodejs-sdk-included)
+ [对 TCP 连接使用“保持连接”](#nodejs-keep-alive)
+ [正在加载 CA 证书](#nodejs-certificate-loading)
+ [实验性 Node.js 功能](#nodejs-experimental-features)
+ [定义采用 Node.js 的 Lambda 函数处理程序](nodejs-handler.md)
+ [使用 .zip 文件归档部署 Node.js Lambda 函数](nodejs-package.md)
+ [使用容器映像部署 Node.js Lambda 函数](nodejs-image.md)
+ [使用 Node.js Lambda 函数的层](nodejs-layers.md)
+ [使用 Lambda 上下文对象检索 Node.js 函数信息](nodejs-context.md)
+ [Node.js Lambda 函数日志记录和监控](nodejs-logging.md)
+ [在 AWS Lambda 中检测 Node.js 代码](nodejs-tracing.md)

## 包含运行时的 SDK 版本
<a name="nodejs-sdk-included"></a>

所有[支持的 Lambda Node.js 运行时](#nodejs-supported-runtimes)都包含 适用于 JavaScript 的 AWS SDK v3 的特定次要版本，而不是[最新版本](https://github.com/aws/aws-sdk-js-v3/releases)。运行时中包含的特定次要版本取决于运行时版本和您的 AWS 区域。要查找您正在使用的运行时中包含的 SDK 特定版本，请使用以下代码创建 Lambda 函数。

**Example index.mjs**  

```
import packageJson from '@aws-sdk/client-s3/package.json' with { type: 'json' };

export const handler = async () => ({ version: packageJson.version });
```
这会返回以下格式的响应：  

```
{
  "version": "3.632.0"
}
```

有关更多信息，请参阅 [在处理程序中使用适用于 JavaScript v3 的 SDK](nodejs-handler.md#nodejs-example-sdk-usage)。

## 对 TCP 连接使用“保持连接”
<a name="nodejs-keep-alive"></a>

默认的 Node.js HTTP/HTTPS 代理会为每个新请求创建一个新的 TCP 连接。为了避免建立新连接的成本，所有[受支持的 Node.js 运行时](#nodejs-supported-runtimes)都默认启用“保持活动”。“保持连接”可以减少使用 SDK 进行多次 API 调用的 Lambda 函数的请求时间。

要禁用“保持连接”，请参阅《AWS SDK for JavaScript 3.x Developer Guide**》中的 [Reusing connections with keep-alive in Node.js](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-reusing-connections.html)。有关使用“保持连接”的更多信息，请参阅 AWS 开发工具博客上的 [HTTP keep-alive is on by default in modular AWS SDK for JavaScript](https://aws.amazon.com/blogs/developer/http-keep-alive-is-on-by-default-in-modular-aws-sdk-for-javascript/)。

## 正在加载 CA 证书
<a name="nodejs-certificate-loading"></a>

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

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

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

## 实验性 Node.js 功能
<a name="nodejs-experimental-features"></a>

上游 Node.js 语言版本默认启用一些实验性功能。Lambda 禁用这些功能以确保运行时稳定且性能一致。下表列出了 Lambda 禁用的实验性功能。


| 实验性功能 | 支持的 Node.js 版本 | Lambda 应用的 Node.js 标志 | 要重新启用的 Lambda 标志 | 
| --- | --- | --- | --- | 
| 支持在 ES 模块中使用 require 导入模块 | Node.js 20、Node.js 22 | `--no-experimental-require-module` | `--experimental-require-module` | 
| 支持自动检测 ES 与 CommonJS 模块 | Node.js 22 | `--no-experimental-detect-module` | `--experimental-detect-module` | 

要启用已禁用的实验性功能，请在 `NODE_OPTIONS` 环境变量中设置重新启用标志。例如，要启用 ES 模块 require 支持，请将 `NODE_OPTIONS` 设置为 `--experimental-require-module`。Lambda 检测到此覆盖并移除相应的禁用标志。

**重要**  
 使用实验性功能可能会导致不稳定和性能问题。这些功能可能会在未来的 Node.js 版本中被更改或移除。使用实验性功能的函数不符合 Lambda 服务水平协议 (SLA) 或 AWS 支持 的资格。