Implementar aplicações ASP.NET - AWS Lambda

Implementar aplicações ASP.NET

Além de hospedar funções orientadas por eventos, você também pode usar o .NET com o Lambda para hospedar aplicações leves do ASP.NET. Você pode criar e implantar aplicações ASP.NET usando o pacote NuGet Amazon.Lambda.AspNetCoreServer. Nesta seção, você aprenderá a implantar uma API da Web do ASP.NET no Lambda usando as ferramentas CLI do .NET Lambda.

Pré-requisitos

SDK do .NET 8

Instale o SDK do .NET 8 e o Runtime do ASP.NET Core.

Amazon.Lambda.Tools

Para criar as funções do Lambda, você usa a extensão .NET Global Tools do Amazon.Lambda.Tools. Para instalar Amazon.Lambda.Tools, execute o comando a seguir:

dotnet tool install -g Amazon.Lambda.Tools

Para obter mais informações sobre a extensão Amazon.Lambda.Tools da CLI do .NET, consulte o repositório AWS Extensions for .NET CLI no GitHub.

Amazon.Lambda.Templates

Para gerar o código da função do Lambda, use o Pacote do NuGet Amazon.Lambda.Templates. Para instalar esse pacote de modelo, execute o comando a seguir:

dotnet new --install Amazon.Lambda.Templates

Implantando uma API Web do ASP.NET no Lambda

Para implantar uma API da Web usando o ASP.NET, você pode usar os modelos do .NET Lambda para criar um novo projeto de API da Web. Use o comando a seguir para inicializar um novo projeto de API da Web do ASP.NET. No comando de exemplo, denominamos o projeto AspNetOnLambda.

dotnet new serverless.AspNetCoreWebAPI -n AspNetOnLambda

Esse comando cria os seguintes arquivos e diretórios no diretório do seu projeto.

. └── 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

Quando o Lambda invoca sua função, o ponto de entrada usado é o arquivo LambdaEntryPoint.cs. O arquivo criado pelo modelo do .NET Lambda contém o seguinte código de função.

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

O ponto de entrada usado pelo Lambda deve herdar de uma das três classes básicas do pacote Amazon.Lambda.AspNetCoreServer. Essas três classes básicas são:

  • APIGatewayProxyFunction

  • APIGatewayHttpApiV2ProxyFunction

  • ApplicationLoadBalancerFunction

A classe padrão usada quando você cria o arquivo LambdaEntryPoint.cs usando o modelo do .NET Lambda fornecido é APIGatewayProxyFunction. A classe básica que você usa na função depende de qual camada de API está na frente da função do Lambda.

Cada uma das três classes básicas contém um método público denominado FunctionHandlerAsync. O nome desse método fará parte da string do manipulador que o Lambda usa para invocar a função. O método FunctionHandlerAsync transforma a carga útil do evento de entrada no formato ASP.NET correto e a resposta do ASP.NET em uma carga útil de resposta do Lambda. Para o projeto de exemplo AspNetOnLambda mostrado, a string do manipulador seria como a que se segue.

AspNetOnLambda::AspNetOnLambda.LambdaEntryPoint::FunctionHandlerAsync

Para implantar a API no Lambda, execute os comandos a seguir para navegar até o diretório que contém o arquivo de código-fonte e implantar a função usando o AWS CloudFormation.

cd AspNetOnLambda/src/AspNetOnLambda dotnet lambda deploy-serverless
dica

Quando você implanta uma API usando o comando dotnet lambda deploy-serverless, o AWS CloudFormation atribui um nome à função do Lambda com base no nome da pilha que você especificou durante a implantação. Para dar um nome personalizado à função do Lambda, edite o arquivo serverless.template para adicionar uma propriedade FunctionName ao recurso AWS::Serverless::Function. Para saber mais, consulte Tipo de nome no Guia do usuário do AWS CloudFormation.

Implantar APIs mínimas do ASP.NET no Lambda

Para implantar uma API mínima do ASP.NET no Lambda, você pode usar os modelos do .NET Lambda para criar um novo projeto de API mínimo. Use o comando a seguir para inicializar um novo projeto de API mínima. Neste exemplo, denominamos o projeto MinimalApiOnLambda.

dotnet new serverless.AspNetCoreMinimalAPI -n MinimalApiOnLambda

O comando cria os arquivos e diretórios a seguir no diretório do seu projeto.

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

O arquivo Program.cs contém o código a seguir.

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();

Para configurar a API mínima para ser executada no Lambda, pode ser necessário editar esse código para que as solicitações e respostas entre o Lambda e o ASP.NET Core sejam traduzidas adequadamente. Por padrão, a função é configurada para uma fonte de eventos API REST. Para uma API HTTP ou um Application Load Balancer, substitua (LambdaEventSource.RestApi) por uma das seguintes opções:

  • (LambdaEventSource.HttpAPi)

  • (LambdaEventSource.ApplicationLoadBalancer)

Para implantar a API mínima no Lambda, execute os comandos a seguir para navegar até o diretório que contém o arquivo de código-fonte e implantar a função usando o AWS CloudFormation.

cd MinimalApiOnLambda/src/MinimalApiOnLambda dotnet lambda deploy-serverless