由 Beau Gosse(高级软件工程师)和 Paras Jain(高级技术客户经理)撰写。
AWS Lambda 现在支持 ,可作为托管运行时和容器基础镜像。此版本使得 Lambda 开发者可以利用 ,包括 API增强、改进的 (NativeAOT)支持和整体性能提升。 .NET 8 还支持 、 和 。您可以使用 、、[AWS 无服务器应用程序模型 (AWSSAM)](https://docs.aws.amazon.com/serverless-application- model/latest/developerguide/install-sam-cli.html)、及其他基础设施即代码工具开发 Lambda 函数。

.NET 8 运行时基于 Amazon Linux 2023(AL2023)
,比之前的 Amazon Linux 2(AL2)基础运行时更小,并且更新了常用库版本,如 glibc 2.34 和
OpenSSL 3。新镜像还采用 microdnf 作为包管理器,作为 dnf 的符号链接,替换了之前 AL2 基础镜像使用的 yum
包管理器。如果您将 Lambda 函数作为容器镜像部署,必须在升级到 .NET 8 基础镜像时更新您的 Dockerfile,使用 dnf 代替
yum。更多信息请参见 。
.NET 8 提供了一系列语言 ,初始化时间会影响性能,因为 Lambda 会创建新的
来自动扩展您的功能。优化 Lambda 基于 .NET 的工作负载性能的方法包括在 System.Text.Json
中使用 或使用 。
为了提升与 .NET 8 的性能,Lambda 默认内存大小已从 256 MB 增加至 512 MB,建议您自行对 .NET 8应用进行功能和性能测试。您可以使用 或 进行性能分析。
对于新发布的 Lambda 运行时,使用量相较于已建立的运行时较少,这可能会导致冷启动时间较长,内部 Lambda子系统的缓存驻留减少。冷启动时间通常会在发布后几周随着使用量增加而改善。因此,AWS 建议在性能稳定之前,请勿将其与其他 Lambda 运行时进行性能比较。
Lambda 于 2022 年 11 月引入了 .NET 。 显示通过消除 JIT 编译,冷启动时间最多可提高 86%。使用托管的 dotnet8
运行时部署 .NET 8 的 Native AOT 函数,可以使您的函数访问 .NET 系统库。例如,libicu 用于全球化,在
provided.al2023 运行时中默认不包含,而在 dotnet8 运行时中则包含。
虽然 Native AOT 并不适合所有 .NET 函数,但 .NET 8 提升了 ,使得您更容易运行 ASP.NET APIs。改进的修剪支持可以消除构建时修剪警告,从而减少潜在的运行时错误。这将增强您对 Native AOT 函数像 JIT编译函数一样工作的信心。修剪支持已添加至 、、和 。
要在 Lambda 中使用 .NET 8,您必须更新工具:
Amazon.Lambda.Tools),请 。您可以通过 dotnet tool update -g Amazon.Lambda.Tools 和 dotnet new install Amazon.Lambda.Templates 升级现有工具和模板。您还可以使用 Powertools for AWS Lambda (.NET) 来实现无服务器最佳实践,例如可观察性、批处理、获取参数、幂等性和特性标志。
sam init。dotnet8 作为运行时。 dotnet8 Hello World 示例还包含一个 Native AOT 模板选项。
您可以修改生成的函数代码,并使用 sam deploy --guided 来部署功能。
dotnet new list --tag Lambda 来获取可用 Lambda 模板的列表。dotnet new <模板名称>。如果使用 Native AOT 创建函数,请运行 dotnet new lambda.NativeAOT 或者使用 时使用 dotnet new serverless.NativeAOT。_src_ 目录中找到生成的 Lambda 函数,其中包含 .csproj 文件。您可以修改生成的函数代码。dotnet lambda deploy-function 并按照提示操作。dotnet lambda invoke-function 在云中测试函数,或使用 Lambda 控制台中的 。您可以使用容器镜像构建和部署 .NET Lambda 函数。请遵循 中的说明。
template.yaml 文件。dotnet8。sam build 重新构建代码。sam deploy 部署更改。TargetFramework 更新为 net8.0。将 Lambda 函数的 NuGet 包更新到最新版本以引入 .NET 8 的更新。
aws-lambda-tools-defaults.json 文件。
1. 将 framework 字段设置为 net8.0。如果未指定,该值由项目文件推断。
2. 将 function-runtime 字段设置为 dotnet8。serverless.template 文件。对于任何 AWS::Lambda::Function 或 AWS::Servereless::Function 资源,将 Runtime 属性设置为 dotnet8。以下示例将 .NET 6 类库函数迁移到 .NET 8 Native AOT 可执行函数。此示例使用可选的 ,提供规范的 .NET 编程模式。
TargetFramework 设置为 net8.0。OutputType 设置为 exe。PublishReadyToRun。PublishAot 并将其设置为 true。Amazon.Lambda.Annotations 和 Amazon.Lambda.RuntimeSupport。您可以通过 IDE 的 NuGet 界面手动更新,或通过在项目目录中运行 dotnet add package Amazon.Lambda.RuntimeSupport 和 dotnet add package Amazon.Lambda.Annotations 来更新。您的项目文件应类似如下所示:
xml <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>exe</OutputType> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <AWSProjectType>Lambda</AWSProjectType> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!-- 在发布时生成本机 AOT 镜像以改善冷启动时间。 --> <PublishAot>true</PublishAot> <!-- StripSymbols 告诉编译器在 Linux 下将调试符号剥离出最终可执行文件,并放入单独的文件中。这将大大减小最终可执行文件的大小。--> <StripSymbols>true</StripSymbols> </PropertyGroup> <ItemGroup> <PackageReference Include="Amazon.Lambda.Core" Version="2.2.0" /> <PackageReference Include="Amazon.Lambda.RuntimeSupport" Version="1.10.0" /> <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.4.0" /> </ItemGroup> </Project>
using Amazon.Lambda.Annotations;[assembly:LambdaGlobalProperties(GenerateMain = true)] 以允许注解框架创建 main 方法。这是因为项目现在是可执行文件而非类库。JsonSerializable 属性。这部分类在构建时用于生成专门的无反射序列化代码。以下是示例:csharp /// <summary> /// 此类用于注册 FunctionHandler 方法的输入事件和返回类型,与 System.Text.Json 源生成器一起使用。 /// 每个用作输入和返回类型的类型必须有 JsonSerializable 属性,否则 JSON序列化程序无法找到序列化信息会导致运行时错误。 /// </summary> [JsonSerializable(typeof(APIGatewayHttpApiV2ProxyRequest))] [JsonSerializable(typeof(APIGatewayHttpApiV2ProxyResponse))] public partialclass MyCustomJsonSerializerContext : JsonSerializerContext { // 通过使用此类派生自 JsonSerializerContext,我们可以在编译时生成无反射的 JSON 序列化器代码。 // 它可以对类及其属性进行反序列化。不过,我们必须将此类标记,以便告诉它要为哪些类型生成序列化代码。 // 请参见 https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text- json-source-generation }
[assembly: LambdaSerializer(typeof(SourceGeneratorLambdaJsonSerializer<LambdaFunctionJsonSerializerContext>))]。如果您不使用之前步骤中的部分类,请将 LambdaFunctionJsonSerializerContext 替换为您的上下文。
如果您使用 aws-lambda-tools-defaults.json :
json { "function-architecture": "x86_64", "function-runtime": "dotnet8", "function-handler": "<your-assembly-name>", "environment-variables": { "ANNOTATIONS_HANDLER": "<your-function-handler>" } }
function-runtime 设置为 dotnet8。function-architecture 设置为与您的构建机器匹配 – x86_64 或 arm64。environment-variables,包括 ANNOTATIONS_HANDLER=<YourFunctionHandler>。将 <YourFunctionHandler> 替换为您的函数处理方法名,以便注解框架知道要从生成的主方法调用哪个方法。function-handler 设置为位于 bin 目录中的可执行程序集名称。默认情况下,这是您的项目名称,指示 运行您的本机二进制文件,而不是启动 .NET 运行时。如果您的项目文件中有 AssemblyName ,则使用该值作为函数处理程序。
Leave a Reply