使用 .NET Lambda Global CLI - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 .NET Lambda Global CLI

.NET CLI 和.NET Lambda 全球工具扩展(Amazon.Lambda.Tools)提供了一种跨平台的方式来创建基于 .NET 的 Lambda 应用程序、将其打包并部署到 Lambda。在本节中,您将学习如何使用 .NET CLI 和 Amazon Lambda 模板创建新的 Lambda .NET 项目,以及如何使用 Amazon.Lambda.Tools 对其进行打包和部署

先决条件

.NET 8 SDK

如果您尚未安装 .NET 8 SDK 和运行时系统,则请安装。

Amazon Amazon.Lambda.Templates .NET 项目模板

要生成您的 Lambda 函数代码,请使用 Amazon.Lambda.Templates NuGet 包。要安装此模板包,请运行以下命令:

dotnet new install Amazon.Lambda.Templates
Amazon Amazon.Lambda.Tools .NET Global CLI 工具

要创建您的 Lambda 函数,请使用 Amazon.Lambda.Tools .NET 全球工具扩展。要安装 Amazon.Lambda.Tools,请运行以下命令:

dotnet tool install -g Amazon.Lambda.Tools

有关 Amazon.Lambda.Tools .NET CLI 扩展的更多信息,请参阅 GitHub 上的适用于 .NET CLI 的 Amazon 扩展存储库。

使用 .NET CLI 创建 .NET 项目

在 .NET CLI 中,您可以使用 dotnet new 命令从命令行创建 .NET 项目。Lambda 使用 Amazon.Lambda.Templates NuGet 软件包提供了其他模板。

安装此软件包后,运行以下命令,以查看可用模板的列表。

dotnet new list

要检查有关模板的详细信息,请使用 help 选项。例如,要查看有关 lambda.EmptyFunction 模板的详细信息,请运行以下命令。

dotnet new lambda.EmptyFunction --help

要为 .NET Lambda 函数创建基本模板,请使用 lambda.EmptyFunction 模板。这将创建一个简单的函数,该函数将字符串作为输入,并使用 ToUpper 方法将其转换为大写。此模板支持以下选项:

  • --name – 函数的名称。

  • --region – 要在其中创建函数的 Amazon 区域。

  • --profile – Amazon SDK for .NET 凭证文件中配置文件的名称。要详细了解 .NET 中的凭证配置文件,请参阅《适用于 .NET 的 Amazon SDK 开发人员指南》中的配置 Amazon 凭证

在此示例中,我们使用默认配置文件和 Amazon Web Services 区域 设置创建了一个名为 myDotnetFunction 的新空函数:

dotnet new lambda.EmptyFunction --name myDotnetFunction

此命令在您的项目目录中创建了以下文件和目录。

└── myDotnetFunction ├── src │   └── myDotnetFunction │   ├── Function.cs │   ├── Readme.md │   ├── aws-lambda-tools-defaults.json │   └── myDotnetFunction.csproj └── test └── myDotnetFunction.Tests ├── FunctionTest.cs └── myDotnetFunction.Tests.csproj

src/myDotnetFunction 目录下,检查以下文件:

  • aws-lambda-tools-defaults.json:这是您部署 Lambda 函数时指定命令行选项的位置。例如:

    "profile" : "default", "region" : "us-east-2", "configuration" : "Release", "function-architecture": "x86_64", "function-runtime":"dotnet8", "function-memory-size" : 256, "function-timeout" : 30, "function-handler" : "myDotnetFunction::myDotnetFunction.Function::FunctionHandler"
  • Function.cs:您的 Lambda 处理程序函数代码。它是一个 C# 模板,该模板包含默认 Amazon.Lambda.Core 库和默认 LambdaSerializer 属性。有关序列化要求和选项的更多信息,请参阅Lambda 函数中的序列化。它还包含一个示例函数,您可以编辑该函数以应用您的 Lambda 函数代码。

    using Amazon.Lambda.Core; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace myDotnetFunction; public class Function { /// <summary> /// A simple function that takes a string and does a ToUpper /// </summary≫ /// <param name="input"></param> /// <param name="context"></param> /// <returns></returns> public string FunctionHandler(string input, ILambdaContext context) { return input.ToUpper(); } }
  • myDotnetFunction.csproj:列出构成您的应用程序的文件和程序集的 MSBuild 文件。

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> <AWSProjectType>Lambda</AWSProjectType> <!-- This property makes the build directory similar to a publish directory and helps the AWS .NET Lambda Mock Test Tool find project dependencies. --> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!-- Generate ready to run images during publishing to improve cold start time. --> <PublishReadyToRun>true</PublishReadyToRun> </PropertyGroup> <ItemGroup> <PackageReference Include="Amazon.Lambda.Core" Version="2.2.0" /> <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.4.0" /> </ItemGroup> </Project>
  • Readme:使用此文件记录您的 Lambda 函数。

myfunction/test 目录下,检查以下文件:

  • myDotnetFunction.Tests.csproj:如前所述,这是一个 MSBuild 文件,其中列出了构成您的测试项目的文件和程序集。另请注意,它包含 Amazon.Lambda.Core 库,因此您可以无缝集成测试函数所需的任何 Lambda 模板。

    <Project Sdk="Microsoft.NET.Sdk"> ... <PackageReference Include="Amazon.Lambda.Core" Version="2.2.0 " /> ...
  • FunctionTest.cssrc 目录中包含的相同 C# 代码模板文件。编辑此文件,以镜像您函数的生产代码并对其进行测试,然后将您的 Lambda 函数上载到生产环境。

    using Xunit; using Amazon.Lambda.Core; using Amazon.Lambda.TestUtilities; using MyFunction; namespace MyFunction.Tests { public class FunctionTest { [Fact] public void TestToUpperFunction() { // Invoke the lambda function and confirm the string was upper cased. var function = new Function(); var context = new TestLambdaContext(); var upperCase = function.FunctionHandler("hello world", context); Assert.Equal("HELLO WORLD", upperCase); } } }

使用 .NET CLI 部署 .NET 项目

要构建您的部署包并将其部署到 Lambda,您可以使用 Amazon.Lambda.Tools CLI 工具。要使用您在前面步骤中创建的文件部署函数,请先导航到包含函数的 .csproj 文件的文件夹。

cd myDotnetFunction/src/myDotnetFunction

要将您的代码作为 .zip 部署包部署到 Lambda,请运行以下命令。选择您自己的函数名称。

dotnet lambda deploy-function myDotnetFunction

在部署过程中,向导会要求您选择 Lambda 执行角色。在本示例中,选择 lambda_basic_role

部署函数后,您可以在云中使用 dotnet lambda invoke-function 命令对其进行测试。对于 lambda.EmptyFunction 模板中的示例代码,您可以通过使用 --payload 选项传递字符串来测试您的函数。

dotnet lambda invoke-function myDotnetFunction --payload "Just checking if everything is OK"

如果您的函数已成功部署,则应看到与以下内容相似的输出。

dotnet lambda invoke-function myDotnetFunction --payload "Just checking if everything is OK" Amazon Lambda Tools for .NET Core applications (5.8.0) Project Home: https://github.com/aws/aws-extensions-for-dotnet-cli, https://github.com/aws/aws-lambda-dotnet Payload: "JUST CHECKING IF EVERYTHING IS OK" Log Tail: START RequestId: id Version: $LATEST END RequestId: id REPORT RequestId: id Duration: 0.99 ms Billed Duration: 1 ms Memory Size: 256 MB Max Memory Used: 12 MB

将 Lambda 层与 .NET CLI 结合使用

注意

在 C# 等编译语言中将层与函数结合使用,不一定会产生与使用 Python 等解释性语言的相同效果。由于 C# 是一种编译语言,因此函数仍然需要在初始化阶段将所有共享程序集手动加载到内存中,而这可能会增加冷启动时间。我们建议您改为在编译时包含任何共享代码,以充分利用内置编译器的优化。

.NET CLI 支持帮助您发布层并部署使用层的 C# 函数的命令。要将层发布到指定的 Amazon S3 存储桶,请在 .csproj 文件所在的同一目录中运行以下命令:

dotnet lambda publish-layer <layer_name> --layer-type runtime-package-store --s3-bucket <s3_bucket_name>

然后,当您使用 .NET CLI 部署函数时,请在以下命令中指定要使用的层 ARN:

dotnet lambda deploy-function <function_name> --function-layers arn:aws:lambda:us-east-1:123456789012:layer:layer-name:1

有关 Hello World 函数的完整示例,请参阅 blank-csharp-with-layer 示例。