介绍用于 AWS Lambda 的 NET 8 运行时 计算博客
NET 8 运行时正式发布于 AWS Lambda
关键要点
AWS Lambda 现支持 NET 8,提供托管运行时和容器基础镜像。NET 8 新增多项特性,包括 API 增强、改进的原生 AOT 支持、性能提升等。使用 AWS 工具包和其他基础设施工具可以轻松构建 Lambda 函数。由 Beau Gosse高级软件工程师和 Paras Jain高级技术客户经理撰写。
AWS Lambda 现在支持 NET 8,可作为托管运行时和容器基础镜像。此版本使得 Lambda 开发者可以利用 NET 8 的特性,包括 API 增强、改进的 Native Ahead of TimeNative AOT支持和整体性能提升。 NET 8 还支持 C# 12、F# 8 和 PowerShell 74。您可以使用 AWS Visual Studio 工具包、AWS NET CLI 扩展、AWS 无服务器应用程序模型 (AWS SAM)、AWS CDK及其他基础设施即代码工具开发 Lambda 函数。
新特性
升级的操作系统
NET 8 运行时基于 Amazon Linux 2023AL2023 精简容器镜像,比之前的 Amazon Linux 2AL2基础运行时更小,并且更新了常用库版本,如 glibc 234 和 OpenSSL 3。新镜像还采用 microdnf 作为包管理器,作为 dnf 的符号链接,替换了之前 AL2 基础镜像使用的 yum 包管理器。如果您将 Lambda 函数作为容器镜像部署,必须在升级到 NET 8 基础镜像时更新您的 Dockerfile,使用 dnf 代替 yum。更多信息请参见 介绍 Amazon Linux 2023 运行时。
性能
NET 8 提供了一系列语言 性能改进,初始化时间会影响性能,因为 Lambda 会创建新的 执行环境 来自动扩展您的功能。优化 Lambda 基于 NET 的工作负载性能的方法包括在 SystemTextJson 中使用 源生成器 或使用 Native AOT。
为了提升与 NET 8 的性能,Lambda 默认内存大小已从 256 MB 增加至 512 MB,建议您自行对 NET 8 应用进行功能和性能测试。您可以使用 AWS Compute Optimizer 或 AWS Lambda Power Tuning 进行性能分析。
对于新发布的 Lambda 运行时,使用量相较于已建立的运行时较少,这可能会导致冷启动时间较长,内部 Lambda 子系统的缓存驻留减少。冷启动时间通常会在发布后几周随着使用量增加而改善。因此,AWS 建议在性能稳定之前,请勿将其与其他 Lambda 运行时进行性能比较。
原生 AOT
Lambda 于 2022 年 11 月引入了 NET Native AOT 支持。 基准测试 显示通过消除 JIT 编译,冷启动时间最多可提高 86。使用托管的 dotnet8 运行时部署 NET 8 的 Native AOT 函数,可以使您的函数访问 NET 系统库。例如,libicu 用于全球化,在 providedal2023 运行时中默认不包含,而在 dotnet8 运行时中则包含。
ios加速器试用三天虽然 Native AOT 并不适合所有 NET 函数,但 NET 8 提升了 修剪支持,使得您更容易运行 ASPNET APIs。改进的修剪支持可以消除构建时修剪警告,从而减少潜在的运行时错误。这将增强您对 Native AOT 函数像 JIT 编译函数一样工作的信心。修剪支持已添加至 Lambda 运行时库、AWS NET SDK、NET Lambda 注解和 NET 8 本身。
在 Lambda 中使用 NET 8
要在 Lambda 中使用 NET 8,您必须更新工具:
安装或更新 NET 8 SDK。如果您使用 AWS SAM, 安装 或 更新 至最新版本。如果您使用 Visual Studio,请安装或更新 AWS ToolKit for Visual Studio。如果您使用 NET Lambda 全局工具扩展AmazonLambdaTools,请 安装 CLI 扩展和模板。您可以通过 dotnet tool update g AmazonLambdaTools 和 dotnet new install AmazonLambdaTemplates 升级现有工具和模板。您还可以使用 Powertools for AWS Lambda (NET) 来实现无服务器最佳实践,例如可观察性、批处理、获取参数、幂等性和特性标志。
创建新的 NET 8 函数
使用 AWS SAM
运行 sam init。选择 1 AWS 快速启动模板。选择其中一个可用模板,例如 Hello World 示例。选择 N 以 使用最流行的运行时和包类型?选择 dotnet8 作为运行时。 dotnet8 Hello World 示例还包含一个 Native AOT 模板选项。按照其余提示创建 NET 8 函数。您可以修改生成的函数代码,并使用 sam deploy guided 来部署功能。
使用 AWS Toolkit for Visual Studio
从 创建新项目 向导中过滤模板到 Lambda 或 无服务器 项目类型并选择模板。单函数部署使用 Lambda,使用 Serverless 来部署一组功能,使用 AWS CloudFormation。继续完成您的项目创建步骤。您可以修改生成的函数代码。要进行部署,在 解决方案资源管理器 中右击项目并选择 发布到 AWS Lambda。使用 AWS NET CLI 扩展
运行 dotnet new list tag Lambda 来获取可用 Lambda 模板的列表。选择一个模板并运行 dotnet new lt模板名称gt。如果使用 Native AOT 创建函数,请运行 dotnet new lambdaNativeAOT 或者使用 NET Lambda 注释框架 时使用 dotnet new serverlessNativeAOT。在 src 目录中找到生成的 Lambda 函数,其中包含 csproj 文件。您可以修改生成的函数代码。要进行部署,运行 dotnet lambda deployfunction 并按照提示操作。您可以使用 dotnet lambda invokefunction 在云中测试函数,或使用 Lambda 控制台中的 测试功能。您可以使用容器镜像构建和部署 NET Lambda 函数。请遵循 文档 中的说明。
从 NET 6 迁移到 NET 8不使用 Native AOT
使用 AWS SAM
打开 templateyaml 文件。将 Runtime 更新为 dotnet8。打开一个终端窗口,使用 sam build 重新构建代码。运行 sam deploy 部署更改。使用 AWS Toolkit for Visual Studio
打开 csproj 项目文件并将 TargetFramework 更新为 net80。将 Lambda 函数的 NuGet 包更新到最新版本以引入 NET 8 的更新。验证您使用的构建命令是否针对 NET 8 运行时。根据您使用的构建/部署工具,可能还需进行其他步骤。更新函数运行时可能就足够了。使用 AWS NET CLI 扩展或 AWS Toolkit for Visual Studio
如果存在,请打开 awslambdatoolsdefaultsjson 文件。将 framework 字段设置为 net80。如果未指定,该值由项目文件推断。将 functionruntime 字段设置为 dotnet8。如果存在,请打开 serverlesstemplate 文件。对于任何 AWSLambdaFunction 或 AWSServerelessFunction 资源,将 Runtime 属性设置为 dotnet8。如果存在,请打开 csproj 项目文件并将 TargetFramework 更新为 net80。将 Lambda 函数的 NuGet 包更新到最新版本以引入 NET 8 的更新。从 NET 6 迁移到 NET 8 Native AOT
以下示例将 NET 6 类库函数迁移到 NET 8 Native AOT 可执行函数。此示例使用可选的 Lambda 注解框架,提供规范的 NET 编程模式。
更新项目文件
打开项目文件。将 TargetFramework 设置为 net80。将 OutputType 设置为 exe。如果存在,请删除 PublishReadyToRun。添加 PublishAot 并将其设置为 true。添加或更新 NuGet 包引用至 AmazonLambdaAnnotations 和 AmazonLambdaRuntimeSupport。您可以通过 IDE 的 NuGet 界面手动更新,或通过在项目目录中运行 dotnet add package AmazonLambdaRuntimeSupport 和 dotnet add package AmazonLambdaAnnotations 来更新。您的项目文件应类似如下所示:

xmlltProject Sdk=MicrosoftNETSdkgt ltPropertyGroupgt ltOutputTypegtexelt/OutputTypegt ltTargetFrameworkgtnet80lt/TargetFrameworkgt ltImplicitUsingsgtenablelt/ImplicitUsingsgt ltNullablegtenablelt/Nullablegt ltAWSProjectTypegtLambdalt/AWSProjectTypegt ltCopyLocalLockFileAssembliesgttruelt/CopyLocalLockFileAssembliesgt lt! 在发布时生成本机 AOT 镜像以改善冷启动时间。 gt ltPublishAotgttruelt/PublishAotgt lt! StripSymbols 告诉编译器在 Linux 下将调试符号剥离出最终可执行文件,并放入单独的文件中。这将大大减小最终可执行文件的大小。gt ltStripSymbolsgttruelt/StripSymbolsgt lt/PropertyGroupgt ltItemGroupgt ltPackageReference Include=AmazonLambdaCore Version=220 /gt ltPackageReference Include=AmazonLambdaRuntimeSupport Version=1100 /gt ltPackageReference Include=AmazonLambdaSerializationSystemTextJson Version=240 /gt lt/ItemGroupgtlt/Projectgt
更新函数代码
引用注解库 using AmazonLambdaAnnotations添加 [assemblyLambdaGlobalProperties(GenerateMain = true)] 以允许注解框架创建 main 方法。这是因为项目现在是可执行文件而非类库。添加如下部分类,并为您需要序列化的类型,包括函数输入和输出,添加 JsonSerializable 属性。这部分类在构建时用于生成专门的无反射序列化代码。以下是示例:csharp/// ltsummarygt/// 此类用于注册 FunctionHandler 方法的输入事件和返回类型,与 SystemTextJson 源生成器一起使用。/// 每个用作输入和返回类型的类型必须有 JsonSerializable 属性,否则 JSON 序列化程序无法找到序列化信息会导致运行时错误。/// lt/summarygt[JsonSerializable(typeof(APIGatewayHttpApiV2ProxyRequest))][JsonSerializable(typeof(APIGatewayHttpApiV2ProxyResponse))]public partial class MyCustomJsonSerializerContext JsonSerializerContext{ // 通过使用此类派生自 JsonSerializerContext,我们可以在编译时生成无反射的 JSON 序列化器代码。 // 它可以对类及其属性进行反序列化。不过,我们必须将此类标记,以便告诉它要为哪些类型生成序列化代码。 // 请参见 https//docsmicrosoftcom/enus/dotnet/standard/serialization/systemtextjsonsourcegeneration}
在 using 语句后添加以下内容以指定要使用的序列化器。 [assembly LambdaSerializer(typeof(SourceGeneratorLambdaJsonSerializerltLambdaFunctionJsonSerializerContextgt))]。如果您不使用之前步骤中的部分类,请将 LambdaFunctionJsonSerializerContext 替换为您的上下文。
更新函数配置
如果您使用 awslambdatoolsdefaultsjson:
json{ functionarchitecture x8664 functionruntime dotnet8 functionhandler ltyourassemblynamegt environmentvariables { ANNOTATIONSHANDLER ltyourfunctionhandlergt }}
将 functionruntime 设置为 dotnet8。将 functionarchitecture 设置为与您的构建机器匹配 x8664 或 arm64。设置或更新environmentvariables,包括 ANNOTATIONSHANDLER=ltYourFunctionHandlergt。将 ltYourFunctionHandlergt 替换为您的函数处理方法名,以便注解框架知道要从生成的主方法调用哪个方法。将 functionhandler 设置为位于 bin 目录中的可执行程序集名称。默认情况下,这是您的项目名称,指示 NET Lambda 引导脚本 运行您的本机二进制文件,而不是启动 NET 运行时。如果您的项目文件中有 AssemblyName,则使用该值作为函数处理程序。部署和测试
部署您的函数。如果
使用 dbt
利用 dbt 和 AWS Glue 构建与管理现代数据架构关键要点在这篇文章中,我们介绍了 dbtglue,一个全新的“可信”dbt适配器,旨在帮助数据工程师利用 dbt 和 AWS Glue 构建现代数据栈。dbtglue 使得用户能够在云数据湖中轻松地进行数据转换,支持多种开放表格式,并且经过 ...
与 Amazon Route 53 的 Active Directory 域服务集成 网络与内容交付
将 Active Directory 域服务与 Amazon Route 53 集成关键要点在这篇文章中,我们将探讨如何将 Amazon Route 53 与 Microsoft Active Directory 域服务 (AD DS) 集成,以实现高效、可扩展的 DNS 解析。文章将主要覆盖以下要...