部署 ASP.NET 应用程序 - AWS Lambda

部署 ASP.NET 应用程序

除了托管事件驱动型函数外,您还可以将 .NET 与 Lambda 结合使用来托管轻量级 ASP.NET 应用程序。您可以使用 Amazon.Lambda.AspNetCoreServer NuGet 包构建和部署 ASP.NET 应用程序。在本节中,您将学习如何使用 .NET Lambda CLI 工具将 ASP.NET Web API 部署到 Lambda。

先决条件

.NET 8 SDK

安装 .NET 8 SDK 和 ASP.NET Core 运行时系统。

Amazon.Lambda.Tools

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

dotnet tool install -g Amazon.Lambda.Tools

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

Amazon.Lambda.Templates

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

dotnet new --install Amazon.Lambda.Templates

将 ASP.NET Web API 部署到 Lambda

要使用 ASP.NET 部署 Web API,您可以使用 .NET Lambda 模板创建新的 Web API 项目。使用以下命令初始化新的 ASP.NET Web API 项目。在示例命令中,我们将项目命名为 AspNetOnLambda

dotnet new serverless.AspNetCoreWebAPI -n AspNetOnLambda

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

. └── AspNetOnLambda ├── src │   └── AspNetOnLambda │   ├── AspNetOnLambda.csproj │   ├── Controllers │   │   └── ValuesController.cs │   ├── LambdaEntryPoint.cs │   ├── LocalEntryPoint.cs │   ├── Readme.md │   ├── Startup.cs │   ├── appsettings.Development.json │   ├── appsettings.json │   ├── aws-lambda-tools-defaults.json │   └── serverless.template └── test └── AspNetOnLambda.Tests ├── AspNetOnLambda.Tests.csproj ├── SampleRequests │   └── ValuesController-Get.json ├── ValuesControllerTests.cs └── appsettings.json

当 Lambda 调用您的函数时,它使用的入口点是 LambdaEntryPoint.cs 文件。由 .NET Lambda 模板创建的文件包含以下代码。

namespace AspNetOnLambda; public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction { protected override void Init(IWebHostBuilder builder) { builder .UseStartup≪Startup≫(); } protected override void Init(IHostBuilder builder) { } }

Lambda 使用的入口点必须继承自 Amazon.Lambda.AspNetCoreServer 包中的三个基类之一。这三个基类为:

  • APIGatewayProxyFunction

  • APIGatewayHttpApiV2ProxyFunction

  • ApplicationLoadBalancerFunction

使用提供的 .NET Lambda 模板创建 LambdaEntryPoint.cs 文件时使用的默认类是 APIGatewayProxyFunction。您在函数中所使用的基类取决于您的 Lambda 函数前面是哪个 API 层。

三个基类中的每一个都包含一个名为 FunctionHandlerAsync 的公共方法。此方法的名称将构成 Lambda 用于调用函数的处理程序字符串的一部分。FunctionHandlerAsync 方法将入站事件有效负载转换为正确的 ASP.NET 格式,将 ASP.NET 响应转换回 Lambda 响应有效负载。对于所示的示例 AspNetOnLambda 项目,处理程序字符串将如下所示。

AspNetOnLambda::AspNetOnLambda.LambdaEntryPoint::FunctionHandlerAsync

要将 API 部署到 Lambda,请运行以下命令导航到包含源代码文件的目录并使用 AWS CloudFormation 部署您的函数。

cd AspNetOnLambda/src/AspNetOnLambda dotnet lambda deploy-serverless
提示

使用 dotnet lambda deploy-serverless 命令部署 API 时,AWS CloudFormation 会根据您在部署期间指定的堆栈名称为您的 Lambda 函数命名。要为您的 Lambda 函数指定自定义名称,请编辑 serverless.template 文件以向 AWS::Serverless::Function 资源添加 FunctionName 属性。要了解更多信息,请参阅《AWS CloudFormation 用户指南》中的名称类型

将 ASP.NET 最小 API 部署到 Lambda

要将 ASP.NET 最小 API 部署到 Lambda,您可以使用 .NET Lambda 模板创建新的 API 项目。使用以下命令初始化新的最小 API 项目。在此示例中,我们将项目命名为 MinimalApiOnLambda

dotnet new serverless.AspNetCoreMinimalAPI -n MinimalApiOnLambda

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

└── MinimalApiOnLambda └── src └── MinimalApiOnLambda ├── Controllers │   └── CalculatorController.cs ├── MinimalApiOnLambda.csproj ├── Program.cs ├── Readme.md ├── appsettings.Development.json ├── appsettings.json ├── aws-lambda-tools-defaults.json └── serverless.template

Program.cs 文件包含以下代码。

var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Add AWS Lambda support. When application is run in Lambda Kestrel is swapped out as the web server with Amazon.Lambda.AspNetCoreServer. This // package will act as the webserver translating request and responses between the Lambda event source and ASP.NET Core. builder.Services.AddAWSLambdaHosting(LambdaEventSource.RestApi); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.MapGet("/", () => "Welcome to running ASP.NET Core Minimal API on AWS Lambda"); app.Run();

要将您的最小 API 配置为在 Lambda 上运行,您可能需要对此代码进行编辑,以便正确翻译 Lambda 和 ASP.NET Core 之间的请求和响应。默认情况下,该函数是针对 REST API 事件源进行配置的。对于 HTTP API 或应用程序负载均衡器,请将 (LambdaEventSource.RestApi) 替换为以下选项之一:

  • (LambdaEventSource.HttpAPi)

  • (LambdaEventSource.ApplicationLoadBalancer)

要将您的最小 API 部署到 Lambda,请运行以下命令导航到包含源代码文件的目录并使用 AWS CloudFormation 部署您的函数。

cd MinimalApiOnLambda/src/MinimalApiOnLambda dotnet lambda deploy-serverless