AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

.NET Core CLI

借助 .NET Core CLI,您可以通过跨平台方式创建基于 .NET 的 Lambda 应用程序。本部分假定您已安装 .NET Core CLI。如果您尚未安装,请单击此处安装。

在 .NET CLI 中,您可以使用 new 命令从命令行创建 .NET 项目。如果要在 Visual Studio 之外创建独立于平台的项目,这种做法将特别有用。要查看可用项目类型的列表,请打开命令行并导航到您安装 .NET Core 运行时的位置,然后输入以下内容:

dotnet new -all

您将看到以下内容:

dotnet new -all Usage: new [options] Options: -h, --help Displays help for this command. -l, --list Lists templates containing the specified name. If no name is specified, lists all templates. -n, --name The name for the output being created. If no name is specified, the name of the current directory is used. -o, --output Location to place the generated output. -i, --install Installs a source or a template pack. -u, --uninstall Uninstalls a source or a template pack. --nuget-source Specifies a NuGet source to use during install. --type Filters templates based on available types. Predefined values are "project", "item" or "other". --force Forces content to be generated even if it would change existing files. -lang, --language Filters templates based on language and specifies the language of the template to create. Templates Short Name Language Tags ---------------------------------------------------------------------------------------------------------------------------- Console Application console [C#], F#, VB Common/Console Class library classlib [C#], F#, VB Common/Library Unit Test Project mstest [C#], F#, VB Test/MSTest xUnit Test Project xunit [C#], F#, VB Test/xUnit Razor Page page [C#] Web/ASP.NET MVC ViewImports viewimports [C#] Web/ASP.NET MVC ViewStart viewstart [C#] Web/ASP.NET ASP.NET Core Empty web [C#], F# Web/Empty ASP.NET Core Web App (Model-View-Controller) mvc [C#], F# Web/MVC ASP.NET Core Web App razor [C#] Web/MVC/Razor Pages ASP.NET Core with Angular angular [C#] Web/MVC/SPA ASP.NET Core with React.js react [C#] Web/MVC/SPA ASP.NET Core with React.js and Redux reactredux [C#] Web/MVC/SPA Razor Class Library razorclasslib [C#] Web/Razor/Library/Razor Class Library ASP.NET Core Web API webapi [C#], F# Web/WebAPI global.json file globaljson Config NuGet Config nugetconfig Config Web Config webconfig Config Solution File sln Solution Examples: dotnet new mvc --auth Individual dotnet new viewstart dotnet new --help

例如,如果您想要创建一个控制台项目,您需要执行以下操作:

  1. 使用以下命令创建一个目录,用于在其中创建您的项目:mkdir example

  2. 使用以下命令导航至该目录:cd example

  3. 输入以下命令:dotnet new console -o myproject

    此操作将在您的 example 目录中创建以下文件:

    • Program.cs,即您在其中写入 Lambda 函数代码的文件。

    • MyProject.csproj,列出构成您的 .NET 应用程序的文件和依赖项的 XML 文件。

AWS Lambda 通过 Amazon.Lambda.Templates NuGet 程序包提供其他模板。要安装此程序包,请运行以下命令:

dotnet new -i Amazon.Lambda.Templates

一旦安装完成,Lambda 模板将作为 dotnet new 的一部分显示。要验证这一点,请再次运行以下命令:

dotnet new -all

您现在应该看到以下内容:

dotnet new -all Usage: new [options] Options: -h, --help Displays help for this command. -l, --list Lists templates containing the specified name. If no name is specified, lists all templates. -n, --name The name for the output being created. If no name is specified, the name of the current directory is used. -o, --output Location to place the generated output. -i, --install Installs a source or a template pack. -u, --uninstall Uninstalls a source or a template pack. --nuget-source Specifies a NuGet source to use during install. --type Filters templates based on available types. Predefined values are "project", "item" or "other". --force Forces content to be generated even if it would change existing files. -lang, --language Filters templates based on language and specifies the language of the template to create. Templates Short Name Language Tags --------------------------------------------------------------------------------------------------------------------------------------------------------- Order Flowers Chatbot Tutorial lambda.OrderFlowersChatbot [C#] AWS/Lambda/Function Lambda Detect Image Labels lambda.DetectImageLabels [C#], F# AWS/Lambda/Function Lambda Empty Function lambda.EmptyFunction [C#], F# AWS/Lambda/Function Lex Book Trip Sample lambda.LexBookTripSample [C#] AWS/Lambda/Function Lambda Simple DynamoDB Function lambda.DynamoDB [C#], F# AWS/Lambda/Function Lambda Simple Kinesis Firehose Function lambda.KinesisFirehose [C#] AWS/Lambda/Function Lambda Simple Kinesis Function lambda.Kinesis [C#], F# AWS/Lambda/Function Lambda Simple S3 Function lambda.S3 [C#], F# AWS/Lambda/Function Lambda ASP.NET Core Web API serverless.AspNetCoreWebAPI [C#], F# AWS/Lambda/Serverless Lambda ASP.NET Core Web Application with Razor Pages serverless.AspNetCoreWebApp [C#] AWS/Lambda/Serverless Serverless Detect Image Labels serverless.DetectImageLabels [C#], F# AWS/Lambda/Serverless Lambda DynamoDB Blog API serverless.DynamoDBBlogAPI [C#] AWS/Lambda/Serverless Lambda Empty Serverless serverless.EmptyServerless [C#], F# AWS/Lambda/Serverless Lambda Giraffe Web App serverless.Giraffe F# AWS/Lambda/Serverless Serverless Simple S3 Function serverless.S3 [C#], F# AWS/Lambda/Serverless Step Functions Hello World serverless.StepFunctionsHelloWorld [C#], F# AWS/Lambda/Serverless Console Application console [C#], F#, VB Common/Console Class library classlib [C#], F#, VB Common/Library Unit Test Project mstest [C#], F#, VB Test/MSTest xUnit Test Project xunit [C#], F#, VB Test/xUnit Razor Page page [C#] Web/ASP.NET MVC ViewImports viewimports [C#] Web/ASP.NET MVC ViewStart viewstart [C#] Web/ASP.NET ASP.NET Core Empty web [C#], F# Web/Empty ASP.NET Core Web App (Model-View-Controller) mvc [C#], F# Web/MVC ASP.NET Core Web App razor [C#] Web/MVC/Razor Pages ASP.NET Core with Angular angular [C#] Web/MVC/SPA ASP.NET Core with React.js react [C#] Web/MVC/SPA ASP.NET Core with React.js and Redux reactredux [C#] Web/MVC/SPA Razor Class Library razorclasslib [C#] Web/Razor/Library/Razor Class Library ASP.NET Core Web API webapi [C#], F# Web/WebAPI global.json file globaljson Config NuGet Config nugetconfig Config Web Config webconfig Config Solution File sln Solution Examples: dotnet new mvc --auth Individual dotnet new viewimports --namespace dotnet new --help

要检查有关特定模板的详细信息,请使用以下命令:

dotnet new lambda.EmptyFunction --help

请注意以下几点:

-p|--profile The AWS credentials profile set in aws-lambda-tools-defaults.json and used as the default profile when interacting with AWS. string - Optional -r|--region The AWS region set in aws-lambda-tools-defaults.json and used as the default region when interacting with AWS. string - Optional

当您创建 Lambda 函数时,您可以设置这些可选值,然后它们将自动写入 aws-lambda-tools-defaults.json 文件,该文件是作为函数创建过程的一部分构建的。下面介绍了其含义:

  • --profile – 您的执行角色

  • --region – 您的函数将驻留的区域。

例如,要创建 Lambda 函数,请运行以下命令,并将 --region 参数的值替换为您选择的地区,将 --profile 替换为您的 IAM 配置文件:

注意

有关 Lambda 函数要求的更多信息,请参阅 CreateFunction

dotnet new lambda.EmptyFunction --name MyFunction --profile default --region region

此过程应创建类似于下面的目录结构:

<dir>myfunction /src/myfunction /test/myfunction

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

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

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

    using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; 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.Json.JsonSerializer))] namespace MyFunction { public class Function { public string FunctionHandler1(string input, ILambdaContext context) { return input?.ToUpper(); } } }
  • MyFunction.csproj:列出构成您的应用程序的文件和程序集的 MSBuild 文件。

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp2.1</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Amazon.Lambda.Core" Version="1.0.0 " /> <PackageReference Include="Amazon.Lambda.Serialization.Json" Version="1.3.0" /> </ItemGroup> </Project>
  • Readme:使用此文件记录您的 Lambda 函数。

myfunction/test directory, examine the following files:

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

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

    using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; 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); } } }

您的函数一通过其测试,您就可以使用 Amazon.Lambda.Tools .NET Core Global Tool 对其进行构建和部署。要安装 .NET Core Global Tool,请运行以下命令。

dotnet tool install -g Amazon.Lambda.Tools

如果您已安装该工具,请确保您使用的是包含以下命令的最新版本。

dotnet tool update -g Amazon.Lambda.Tools

有关 Amazon.Lambda.Tools .NET Core Global 的更多信息,请参阅其 GitHub 存储库

安装 Amazon.Lambda.Tools 之后,您可以使用以下命令部署函数:

dotnet lambda deploy-function MyFunction –-function-role role

部署完成后,您可以使用以下命令在生产环境中对其进行重新测试,并将不同的值传递到您的 Lambda 函数处理程序:

dotnet lambda invoke-function MyFunction --payload "Just Checking If Everything is OK"

假设一切步骤均已成功,您应该会看到以下内容:

dotnet lambda invoke-function MyFunction --payload "Just Checking If Everything is OK" 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: 100 ms Memory Size: 256 MB Max Memory Used: 12 MB

序列化 Lambda 函数

对于任何使用 Stream 对象以外的输入或输出类型的 Lambda 函数,您都需要向应用程序中添加一个序列化库。您可以通过下列方式来执行此操作:

  • 使用 Json.NET。Lambda 将使用 JSON.NET 作为 NuGet 程序包,从而提供 JSON 串行器的实现实例。

  • 通过实施 ILambdaSerializer 接口(作为 Amazon.Lambda.Core 库的一部分提供)创建您自己的序列化库。该接口定义了两种方法:

    • T Deserialize<T>(Stream requestStream);

      通过实施此方法,您可以将请求负载从 Invoke API 反序列化至传递到 Lambda 函数处理程序的对象中。

    • T Serialize<T>(T response, Stream responseStream);

      通过实施此方法,您可以将从 Lambda 函数处理程序中返回的结果序列化到 Invoke API 返回的响应负载中。

您可以使用任意一个串行器,方法是将其作为依赖项添加到您的 MyProject.csproj 文件中。

... <ItemGroup> <PackageReference Include="Amazon.Lambda.Core" Version="1.0.0" /> <PackageReference Include="Amazon.Lambda.Serialization.Json" Version="1.3.0" /> </ItemGroup>

然后将其添加到您的 AssemblyInfo.cs 文件中。例如,如果您使用的是默认 Json.NET 串行器,则需要添加以下项:

[assembly:LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

注意

您可以在方法级别定义一个自定义序列化属性,用于覆盖在程序集级别指定的默认串行器。有关更多信息,请参阅处理标准数据类型

本页内容: