AWS Lambda现已支持Nodejs 20x运行时
关键要点
Nodejs 20x运行时已在AWS Lambda中推出,用户可以使用该版本进行开发。新版本可通过指定参数nodejs20x进行调用,同时支持配置CA证书的加载以优化性能。Nodejs 20引入了一系列新的语言特性和性能提升。由Pascal Vogel与Andrea Amorosi撰写,发布于2023年11月15日。
用户现在可以使用 Nodejs 20运行时来开发 AWS Lambda 函数。此版本已经处于 活动LTS状态,并准备好供广泛使用。要使用此新版本,可在创建或更新函数时指定运行时参数值 nodejs20x,或者使用适当的容器 基础镜像。
您可以将Nodejs 20与 AWS Lambda PowertoolsTypeScript 搭配使用,这是一个开发者工具包,旨在实施无服务器最佳实践并提升开发者的工作效率。Powertools for AWS Lambda包含诸多支持常见模式的库,如可观察性、参数存储集成、幂等性、批处理等 更多功能。
Nodejs 20同样支持 Lambda@Edge,允许您自定义通过 Amazon CloudFront 交付的低延迟内容。
一元梯子这篇博客主要强调了Nodejs运行时的重要变化、新的Nodejs语言更新,以及如何在无服务器应用中利用Nodejs 20运行时。
Nodejs 20运行时更新
根CA证书加载的变化
默认情况下,Nodejs包含来自 知名证书提供商 的根证书。但是,早期版本的Lambda Nodejs最高支持至Nodejs 18会附加亚马逊特定的CA证书,从而简化了访问其他AWS服务的函数创建过程。例如,它包含了 Amazon RDS 所需的证书,用于验证安装在RDS数据库上的服务器身份证书 如何执行SSL验证。
但加载这些附加证书会影响冷启动时的性能。从Nodejs 20开始,Lambda默认不再加载这些额外的CA证书。Nodejs 20运行时包含的证书文件存储在 /var/runtime/cacertpem。通过将环境变量 NODEEXTRACACERTS 设置为 /var/runtime/cacertpem,您可以恢复Nodejs 18及早期运行时的行为。
这将导致Nodejs在冷启动期间验证和加载所有的亚马逊CA证书,所需时间通常会比仅加载特定证书更长。为了获得最佳性能,建议将您需要的证书打包到部署包中,并通过 NODEEXTRACACERTS 加载。这些证书文件应当包含一个或多个PEM格式的受信任的根证书或中间CA证书。
例如,对于RDS,您可以将所需的证书与代码一起包含为 certificates/rdspem,然后通过以下方式加载:
bashNODEEXTRACACERTS=/var/task/certificates/rdspem
更多关于设置环境变量的详细指南,请参见 使用Lambda环境变量 AWS Lambda开发者指南。
Amazon Linux 2023
Nodejs 20运行时基于 providedal2023 运行时,而 providedal2023 又基于 Amazon Linux 2023最小化容器镜像版本,带来了相较于Amazon Linux 2AL2的一系列改进。
providedal2023只包含安装其他包所需的基本组件,并且其压缩镜像体积小于40MB,相较于AL2的100MB以上基础镜像有显著减小。
借助于 glibc 版本234,用户可以访问到更近期版本的 glibc,相较于AL2中使用的226版本有所更新。
Amazon Linux 2023最小镜像使用 microdnf 作为包管理器,并以 dnf 的别名存在,取代了在AL2基础镜像中使用的 yum。另外,还包括了 curl 和 gnupg2 的最小版本:curlminimal 和 gnupg2minimal。
更多关于 providedal2023 运行时的信息,请参见博客文章 介绍Amazon Linux 2023运行时用于AWS Lambda 以及 Amazon Linux 2023发布博客。
运行时接口客户端
Nodejs 20运行时使用 开源AWS Lambda NodeJS运行时接口客户端RIC。您现在可以在Open Container InitiativeOCILambda容器镜像中使用与管理的Nodejs 20运行时相同的RIC版本。
Nodejs 20运行时支持 Lambda响应流,使您可以在数据可用时将响应有效载荷数据发送给调用者。响应流功能可以通过减少首字节时间来提升应用的性能,还可以在较长的任务中指示进展,并允许您构建返回大于6MB的有效载荷的函数,这是Lambda的缓冲响应限制。
设置Nodejs堆内存大小
Nodejs允许您通过 maxoldspacesize 和 maxsemispacesize 选项来配置v8引擎的堆大小。默认情况下,Lambda会用基于配置的内存大小的值覆盖Nodejs的默认值。如果您需要控制运行时的内存分配,现在可以使用 NODEOPTIONS 环境变量设置这两个选项,而无需使用 exec包装脚本。有关详细信息,请查看 使用Lambda环境变量 AWS Lambda开发者指南。
使用 [maxoldspacesize](https//nodejsorg/api/clihtml#maxoldspacesizesizeinmegabytes) 选项来设置V8旧内存区域的最大内存大小,使用 [maxsemispacesize](https//nodejsorg/api/clihtml#maxsemispacesizesizeinmegabytes) 选项来设置V8的垃圾收集器的最大半空间大小。有关这些选项的更多信息,请参见 Nodejs文档。
Nodejs 20语言更新
语言特性
通过此次发布,Lambda客户可以利用新的Nodejs 20语言特性,包括:
HTTP(S)/11 默认 keepAlive Nodejs现在默认为 keepAlive 设置为true。任何外发的HTTPs连接都使用HTTP 11保持活动连接,默认等待时长为5秒。这能够提升通过重用连接带来的吞吐量。Fetch API默认启用 Nodejs的全局 Fetch API 默认启用,不过仍然处于实验性模块。更快的URL解析 Nodejs 20引入了 Ada 20 URL解析器,为URL解析带来了性能提升。这项功能也已移植至Nodejs 1870版本。Web Crypto API已稳定 Nodejs对标准 Web Crypto API 的实现已标记为稳定。您可以通过 [globalThiscrypto](https//nodejsorg/api/webcryptohtml) 访问提供的加密原语。WebAssembly支持 Nodejs 20默认启用实验性的 WebAssembly系统接口WASIAPI,无需设置实验性标志。有关Nodejs 20语言特性的详细概述,请参见 Nodejs 20发布博客 以及 Nodejs 20更新日志。
性能考虑
Nodejs 193引入了一项变更,影响非必要模块在Nodejs进程启动期间的懒加载方式。这项变更使得Lambda函数在初始化每个执行环境时减少了工作量,然后在首次函数调用时加载模块。这项改动在Nodejs 20中同样保留。
开发人员应继续监测和测试函数性能,并优化函数代码与配置。要了解如何在Lambda中优化Nodejs性能,请参见 性能优化 Lambda操作指南和我们关于 优化AWS Lambda中的Nodejs依赖项 的博客文章。
从早期Nodejs运行时迁移
从Nodejs 16迁移
Lambda有时会在语言版本的结束日期后,延迟对Lambda运行时的弃用。此期间,Lambda仅会对运行时OS应用安全补丁。在语言版本达到结束支持日期后,Lambda不再对编程语言运行时应用安全补丁。
针对Nodejs 16的情况,我们将弃用的时间从社区的结束支持日期2023年9月11日延迟至2024年6月12日。这为客户提供了直接从Nodejs 16迁移到Nodejs 20的机会,跳过Nodejs 18。
AWS SDK for JavaScript
在Nodejs 16之前,Lambda的Nodejs运行时包括了 AWS JavaScript SDK版本2。而最新的则是 AWS JavaScript SDK版本3,于2020年12月 发布。自Nodejs 18开始,并持续到Nodejs 20,Lambda Nodejs运行时已将AWS SDK for JavaScript的版本从v2升级至v3。客户在从Nodejs 16或早期运行时升级时,如果仍在使用SDK v2,应 升级代码以使用v3 SDK。
为了获得最佳性能,并完全控制代码依赖关系,我们建议将AWS SDK 进行打包与最小化,而不是使用跑在运行时中的SDK。有关更多信息,请查看 优化AWS Lambda中的Nodejs依赖项。
在AWS Lambda中使用Nodejs 20运行时
AWS管理控制台
要使用Nodejs 20运行时开发您的Lambda函数,请在创建或更新函数时指定运行时参数值Nodejs 20x。Nodejs 20运行时版本现已在 AWS Lambda控制台 的“创建函数”页面中的运行时下拉列表中可用:
要将现有Lambda函数更新为Nodejs 20,请在Lambda控制台中导航至该函数,然后在“运行时设置”面板中选择 编辑。新的Nodejs版本在运行时下拉列表中可用:
AWS Lambda 容器镜像
通过修改Dockerfile中的 FROM 声明来更改Nodejs基本镜像版本:
dockerfileFROM publicecraws/lambda/nodejs20
复制函数代码
COPY lambdahandlerxx {LAMBDATASKROOT}
本地运行Nodejs 20 Docker镜像的客户,包括使用AWS SAM的客户,需要将Docker安装升级至版本201010或更高。
AWS无服务器应用程序模型AWS SAM
在 AWS SAM 中,将 Runtime 属性设置为 node20x 以使用该版本:
yamlAWSTemplateFormatVersion 20100909Transform AWSServerless20161031
Resources MyFunction Type AWSServerlessFunction Properties Handler lambdafunctionlambdahandler Runtime nodejs20x CodeUri myfunction/ Description My Nodejs Lambda Function
AWS云开发工具包AWS CDK
在 AWS CDK 中,将 runtime 属性设置为 RuntimeNODEJS20X 以使用该版本:

typescriptimport as cdk from awscdklibimport as lambda from awscdklib/awslambdaimport as path from pathimport { Construct } from constructs
export class CdkStack extends cdkStack { constructor(scope Construct id string props cdkStackProps) { super(scope id props)
// 定义您的堆栈的代码// 启用Nodejs 20的Lambda函数const lambdaFunction = new lambdaFunction(this node20LambdaFunction { runtime lambdaRuntimeNODEJS20X code lambdaCodefromAsset(pathjoin(dirname //lambda)) handler indexhandler})}}
结论
Lambda现在支持Nodejs 20。此次发布使用Amazon Linux 2023操作系统,支持可配置CA证书的加载以提升冷启动速度,以及博客中详细说明的其他改进。
您可以通过 AWS管理控制台、AWS CLI、AWS SDK、AWS SAM、AWS CDK 或您选择的基础设施即代码IaC工具来构建和部署使用Nodejs 20运行时的函数。如果您更喜欢使用容器镜像构建和部署函数,也可以使用 Nodejs 20容器基础镜像。
Nodejs 20运行时使开发人员能够构建更高效、更强大、可扩展的无服务器应用。请立即在Lambda中尝试Nodejs运行时,并在Lambda文档中阅读有关 Nodejs编程模型 的内容,了解有关编写Nodejs 20函数的更多信息。
有关更多无服务器学习资源,请访问 Serverless Land。
标签 贡献的、无服务器的