ASP.NET 애플리케이션 배포하기
ASP.NET 애플리케이션 배포하기 (Deploy ASP.NET applications)
이벤트 기반 함수를 호스팅하는 것뿐 아니라, .NET을 Lambda와 함께 사용해 가벼운 ASP.NET 애플리케이션을 호스팅할 수도 있어요. Amazon.Lambda.AspNetCoreServer NuGet 패키지로 ASP.NET 애플리케이션을 빌드·배포할 수 있어요. 이 섹션에서는 .NET Lambda CLI 도구로 ASP.NET 웹 API를 Lambda에 배포하는 방법을 배워요.
본문
사전 요구 사항
- .NET 8 SDK — .NET 8 SDK와 ASP.NET Core Runtime을 설치합니다.
- Amazon.Lambda.Tools — Lambda 함수를 만들려면 Amazon.Lambda.Tools .NET Global Tools 확장을 사용합니다. 설치하려면 다음 명령을 실행합니다.
dotnet tool install -g Amazon.Lambda.Tools - Amazon.Lambda.Templates — Lambda 함수 코드를 생성하려면 Amazon.Lambda.Templates NuGet 패키지를 사용합니다. 이 템플릿 패키지를 설치하려면 다음 명령을 실행합니다.
dotnet new --install Amazon.Lambda.Templates
ASP.NET Web API를 Lambda에 배포하기
ASP.NET을 사용해 웹 API를 배포하려면 .NET Lambda 템플릿으로 새 웹 API 프로젝트를 만들 수 있어요. 다음 명령으로 새 ASP.NET 웹 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 패키지의 세 베이스 클래스 중 하나를 상속해야 해요. 세 베이스 클래스는 다음과 같아요.
APIGatewayProxyFunctionAPIGatewayHttpApiV2ProxyFunctionApplicationLoadBalancerFunction
제공된 .NET Lambda 템플릿으로 LambdaEntryPoint.cs 파일을 만들 때 사용되는 기본 클래스는 APIGatewayProxyFunction이에요. 함수에서 사용하는 베이스 클래스는 Lambda 함수 앞에 어떤 API 계층이 있는지에 따라 달라져요.
세 베이스 클래스 각각에는 FunctionHandlerAsync라는 공용 메서드가 있어요. 이 메서드 이름은 Lambda가 함수를 호출하는 데 사용하는 handler 문자열의 일부를 이뤄요. FunctionHandlerAsync 메서드는 들어오는 이벤트 payload를 올바른 ASP.NET 형식으로 변환하고, ASP.NET 응답을 다시 Lambda 응답 payload로 변환해요. 예시 AspNetOnLambda 프로젝트의 handler 문자열은 다음과 같아요.
AspNetOnLambda::AspNetOnLambda.LambdaEntryPoint::FunctionHandlerAsync
API를 Lambda에 배포하려면 다음 명령으로 소스 코드 파일이 있는 디렉토리로 이동하고 CloudFormation으로 함수를 배포해요.
cd AspNetOnLambda/src/AspNetOnLambda
dotnet lambda deploy-serverless
팁
dotnet lambda deploy-serverless명령으로 API를 배포하면 CloudFormation이 배포 중에 지정한 스택 이름을 기반으로 Lambda 함수에 이름을 붙여요. Lambda 함수에 커스텀 이름을 주려면 serverless.template 파일을 편집해AWS::Serverless::Function리소스에FunctionName속성을 추가하세요.
ASP.NET minimal API를 Lambda에 배포하기
ASP.NET minimal API를 Lambda에 배포하려면 .NET Lambda 템플릿으로 새 minimal API 프로젝트를 만들 수 있어요. 다음 명령으로 새 minimal 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();
minimal API를 Lambda에서 실행하도록 구성하려면 Lambda와 ASP.NET Core 사이의 요청·응답이 제대로 변환되도록 이 코드를 편집해야 할 수 있어요. 기본적으로 함수는 REST API 이벤트 소스로 구성돼요. HTTP API나 애플리케이션 로드 밸런서를 위해 (LambdaEventSource.RestApi)를 다음 옵션 중 하나로 바꿔요.
(LambdaEventSource.HttpAPi)(LambdaEventSource.ApplicationLoadBalancer)
minimal API를 Lambda에 배포하려면 다음 명령으로 소스 코드 파일이 있는 디렉토리로 이동하고 CloudFormation으로 함수를 배포해요.
cd MinimalApiOnLambda/src/MinimalApiOnLambda
dotnet lambda deploy-serverless