部署 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
提示
使用
命令部署 API 时,AWS CloudFormation 会根据您在部署期间指定的堆栈名称为您的 Lambda 函数命名。要为您的 Lambda 函数指定自定义名称,请编辑 dotnet lambda deploy-serverless
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