

# ASP.NET 애플리케이션 배포
<a name="csharp-package-asp"></a>

이벤트 기반 함수를 호스팅할 뿐만 아니라 Lambda와 함께.NET을 사용하여 가벼운 ASP.NET 애플리케이션을 호스팅할 수도 있습니다. `Amazon.Lambda.AspNetCoreServer` NuGet 패키지를 사용하여 ASP.NET 애플리케이션을 빌드하고 배포할 수 있습니다. 이 섹션에서는.NET Lambda CLI 도구를 사용하여 Lambda에 ASP.NET 웹 API를 배포하는 방법을 알아봅니다.

**Topics**
+ [사전 조건](#csharp-package-asp-prerequisites)
+ [Lambda에 ASP.NET 웹 API 배포하기](#csharp-package-asp-deploy-api)
+ [Lambda에 ASP.NET 최소 API 배포하기](#csharp-package-asp-deploy-minimal)

## 사전 조건
<a name="csharp-package-asp-prerequisites"></a>

**.NET 8 SDK**  
[.NET 8](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) SDK 및 ASP.NET Core 런타임을 설치합니다.

**Amazon.Lambda.Tools**  
Lambda 함수를 생성하려면 [https://www.nuget.org/packages/Amazon.Lambda.Tools](https://www.nuget.org/packages/Amazon.Lambda.Tools) [.NET 글로벌 도구 확장](https://aws.amazon.com/blogs/developer/net-core-global-tools-for-aws/)을 사용합니다. Amazon.Lambda.Tools를 설치하려면 다음 명령을 실행합니다.  

```
dotnet tool install -g Amazon.Lambda.Tools
```
Amazon.Lambda.Tools .NET CLI 확장에 대한 자세한 내용은 GitHub에서 [AWS Extensions for .NET CLI](https://github.com/aws/aws-extensions-for-dotnet-cli) 리포지토리를 참조하세요.

**Amazon.Lambda.Templates**  
Lambda 함수 코드를 생성하려면 [https://www.nuget.org/packages/Amazon.Lambda.Templates](https://www.nuget.org/packages/Amazon.Lambda.Templates) NuGet 패키지를 사용합니다. 이 템플릿 패키지를 설치하려면 다음 명령을 실행합니다.  

```
dotnet new --install Amazon.Lambda.Templates
```

## Lambda에 ASP.NET 웹 API 배포하기
<a name="csharp-package-asp-deploy-api"></a>

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` 패키지의 세 가지 기본 클래스 중 하나를 상속해야 합니다. 이 세 가지 기본 클래스는 다음과 같습니다.
+ `APIGatewayProxyFunction`
+ `APIGatewayHttpApiV2ProxyFunction`
+ `ApplicationLoadBalancerFunction`

제공된.NET Lambda 템플릿을 사용하여 `LambdaEntryPoint.cs` 파일을 생성할 때 사용되는 기본 클래스는 `APIGatewayProxyFunction`입니다. 함수에서 사용하는 기본 클래스는 Lambda 함수 앞에 있는 API 계층에 따라 달라집니다.

세 기본 클래스 각각에는 `FunctionHandlerAsync`(이)라는 퍼블릭 메서드가 포함되어 있습니다. 이 메서드의 이름은 Lambda가 함수를 간접 호출하는 데 사용하는 [핸들러 문자열](csharp-handler.md#csharp-class-library-handlers)에 속합니다. 이 `FunctionHandlerAsync` 메서드는 인바운드 이벤트 페이로드를 올바른 ASP.NET 형식으로 변환하고 ASP.NET 응답을 Lambda 응답 페이로드로 다시 변환합니다. 표시된 예제 `AspNetOnLambda` 프로젝트의 경우 핸들러 문자열은 다음과 같습니다.

```
AspNetOnLambda::AspNetOnLambda.LambdaEntryPoint::FunctionHandlerAsync
```

Lambda에 API를 배포하려면 다음 명령을 실행하여 소스 코드 파일이 포함된 디렉토리로 이동하고 CloudFormation을(를) 사용하여 함수를 배포하십시오.

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

**작은 정보**  
`dotnet lambda deploy-serverless` 명령을 사용하여 API를 배포하는 경우 CloudFormation에서는 배포 중에 지정한 스택 이름을 기반으로 Lambda 함수에 이름을 지정합니다. Lambda 함수에 사용자 지정 이름을 지정하려면 `serverless.template` 파일을 편집하여 `AWS::Serverless::Function` 리소스에 `FunctionName` 속성을 추가하십시오. 자세한 내용은 *CloudFormation 사용 설명서*에서 [이름 유형](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html)을 참조하세요.

## Lambda에 ASP.NET 최소 API 배포하기
<a name="csharp-package-asp-deploy-minimal"></a>

Lambda에 ASP.NET 최소 API를 배포하려면.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();
```

Lambda에서 실행하도록 최소 API를 구성하려면 Lambda와 ASP.NET Core 간의 요청 및 응답이 제대로 변환되도록 이 코드를 편집해야 할 수 있습니다. 기본적으로 함수는 REST API 이벤트 소스에 맞게 구성됩니다. HTTP API 또는 Application Load Balancer의 경우 다음 옵션 중 하나를 사용하여 `(LambdaEventSource.RestApi)`을(를) 대체합니다.
+ `(LambdaEventSource.HttpAPi)`
+ `(LambdaEventSource.ApplicationLoadBalancer)`

Lambda에 최소 API를 배포하려면 다음 명령을 실행하여 소스 코드 파일이 포함된 디렉토리로 이동하고 CloudFormation을(를) 사용하여 함수를 배포하십시오.

```
cd MinimalApiOnLambda/src/MinimalApiOnLambda
dotnet lambda deploy-serverless
```