

# .zip 파일 아카이브를 사용하여 C\$1 Lambda 함수를 빌드 및 배포
<a name="csharp-package"></a>

.NET 배포 패키지(.zip 파일 아카이브)에는 함수의 컴파일된 어셈블리와 해당 어셈블리의 모든 종속 항목이 함께 포함되어 있습니다. 패키지는 `proj.deps.json` 파일도 포함합니다. 이 패키지는 함수의 모든 종속성과 `proj.runtimeconfig.json` 파일을 .NET 런타임으로 전송하며, 해당 파일은 런타임을 구성하는 데 사용됩니다.

개별 Lambda 함수를 배포하려면.`Amazon.Lambda.Tools` NET Lambda 글로벌 CLI를 사용하면 됩니다. `dotnet lambda deploy-function` 명령을 사용하면.zip 배포 패키지가 자동으로 생성되어 Lambda에 배포됩니다. 하지만 AWS Serverless Application Model(AWS SAM) 또는 AWS Cloud Development Kit (AWS CDK)와(과) 같은 프레임워크를 사용하여 .NET 애플리케이션을 AWS에 배포하는 것이 좋습니다.

서버리스 애플리케이션은 일반적으로 특정 비즈니스 작업을 수행하기 위해 함께 작동하는 Lambda 함수와 기타 관리형 AWS 서비스의 조합으로 구성됩니다. AWS SAM과 AWS CDK는 규모에 따라 다른 AWS 서비스와 함께 Lambda 함수를 빌드하고 배포하는 것을 단순화합니다. [AWS SAM 템플릿 사양](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification.html)에서는 서버리스 애플리케이션을 구성하는 Lambda 함수, API, 권한, 구성 및 기타 AWS 리소스를 설명하는 간단하고 깔끔한 구문을 제공합니다. [AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/home.html)을(를) 사용하여 클라우드 인프라를 코드로 정의하면 .NET과 같은 최신 프로그래밍 언어와 프레임워크를 활용하여 클라우드에서 신뢰할 수 있고, 확장 가능하며, 비용 대비 효율적인 애플리케이션을 빌드하는 데 도움이 됩니다. AWS CDK 및 AWS SAM은(는) 모두 .NET Lambda 글로벌 CLI를 사용하여 함수를 패키징합니다.

[.NET Core CLI를 사용](csharp-package-cli.md#csharp-layers)하면 C\$1의 함수와 함께 [Lambda 계층](chapter-layers.md)을 사용할 수 있지만 이는 권장되지 않습니다. 계층을 사용하는 C\$1의 함수는 [초기화 단계](lambda-runtime-environment.md#runtimes-lifecycle-ib) 중 공유 어셈블리를 메모리에 수동으로 로드하므로 콜드 시작 시간을 늘릴 수 있습니다. 대신 컴파일 시 모든 공유 코드를 포함하여 런타임 시 어셈블리 로드의 성능 영향을 방지합니다.

AWS SAM, AWS CDK 및 .NET Lambda 글로벌 CLI를 사용하여.NET Lambda 함수를 빌드하고 배포하는 지침은 다음 섹션에서 확인할 수 있습니다.

**Topics**
+ [

# .NET Lambda 글로벌 CLI 사용
](csharp-package-cli.md)
+ [

# AWS SAM을 사용하여 C\$1 Lambda 함수 배포
](csharp-package-sam.md)
+ [

# AWS CDK을 사용하여 C\$1 Lambda 함수 배포
](csharp-package-cdk.md)
+ [

# ASP.NET 애플리케이션 배포
](csharp-package-asp.md)

# .NET Lambda 글로벌 CLI 사용
<a name="csharp-package-cli"></a>

.NET CLI와 .NET Lambda 글로벌 도구 확장(`Amazon.Lambda.Tools`)은.NET 기반 Lambda 애플리케이션을 생성하고, 패키징하고, Lambda에 배포하는 크로스 플랫폼 방법을 제공합니다. 이 섹션에서는.NET CLI 및 Amazon Lambda 템플릿을 사용하여 새 Lambda .NET 프로젝트를 생성하고 `Amazon.Lambda.Tools`을(를) 사용하여 패키징하고 배포하는 방법을 알아봅니다

**Topics**
+ [

## 사전 조건
](#csharp-package-cli-prerequisites)
+ [

## .NET CLI를 사용하여 .NET 프로젝트 생성
](#csharp-package-cli-create)
+ [

## .NET CLI를 사용하여 .NET 프로젝트 배포하기
](#csharp-package-cli-deploy)
+ [

## .NET CLI와 함께 Lambda 계층 사용
](#csharp-layers)

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

**.NET 8 SDK**  
아직 하지 않았다면 [.NET 8](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) SDK 및 런타임을 설치하세요.

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

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

**AWS Amazon.Lambda.Tools .NET 글로벌 CLI 도구**  
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) 리포지토리를 참조하세요.

## .NET CLI를 사용하여 .NET 프로젝트 생성
<a name="csharp-package-cli-create"></a>

.NET CLI에서는 `dotnet new` 명령을 사용해 한 명령줄에서 .NET 프로젝트를 생성합니다. Lambda는 [https://www.nuget.org/packages/Amazon.Lambda.Templates](https://www.nuget.org/packages/Amazon.Lambda.Templates) NuGet 패키지를 사용하여 추가 템플릿을 제공합니다.

이 패키지를 설치한 후 다음 명령을 실행하여 사용 가능한 템플릿 목록을 확인합니다.

```
dotnet new list
```

템플릿에 대한 세부 정보를 검토하려면 `help` 옵션을 사용하세요. 예를 들어 `lambda.EmptyFunction` 템플릿에 대한 세부 정보를 확인하려면 다음 명령을 실행합니다.

```
dotnet new lambda.EmptyFunction --help
```

.NET Lambda 함수의 기본 템플릿을 생성하려면 `lambda.EmptyFunction` 템플릿을 사용하십시오. 그러면 문자열을 입력으로 받아 `ToUpper` 메서드를 사용하여 대문자로 변환하는 간단한 함수가 생성됩니다. 이 템플릿은 다음 옵션을 지원합니다.
+ `--name` – 함수의 이름입니다.
+ `--region` - 함수를 생성할 AWS 리전입니다.
+ `--profile` – 사용자의 AWS SDK for .NET 자격 증명에 있는 프로필의 이름입니다. .NET의 보안 인증 프로필에 대한 자세한 내용은 .NET 개발자 안내서용 *AWS SDK*에서 [AWS 보안 인증 구성](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html)을 참조하십시오.

이 예제에서는 기본 프로필 및 AWS 리전 설정을 사용하여 `myDotnetFunction`(이)라는 빈 함수를 새로 만듭니다.

```
dotnet new lambda.EmptyFunction --name myDotnetFunction
```

이 명령은 프로젝트 디렉터리에 다음 파일 및 디렉터리를 생성합니다.

```
└── myDotnetFunction
    ├── src
    │   └── myDotnetFunction
    │       ├── Function.cs
    │       ├── Readme.md
    │       ├── aws-lambda-tools-defaults.json
    │       └── myDotnetFunction.csproj
    └── test
        └── myDotnetFunction.Tests
            ├── FunctionTest.cs
            └── myDotnetFunction.Tests.csproj
```

`src/myDotnetFunction` 디렉터리 아래에서 다음과 같은 파일들을 검사합니다.
+ **aws-lambda-tools-defaults.json**: Lambda 함수를 배포할 때 이 파일에 명령줄 옵션을 지정합니다. 예:

  ```
    "profile" : "default",
    "region" : "us-east-2",
    "configuration" : "Release",
    "function-architecture": "x86_64",
    "function-runtime":"dotnet8",
    "function-memory-size" : 256,
    "function-timeout" : 30,
    "function-handler" : "myDotnetFunction::myDotnetFunction.Function::FunctionHandler"
  ```
+ **Function.cs**: Lambda 핸들러 함수 코드입니다. 이 코드는 기본 `Amazon.Lambda.Core` 라이브러리와 기본 `LambdaSerializer` 속성을 포함하는 C\$1 템플릿에 속합니다. 직렬화 요구 사항들과 옵션들에 관한 자세한 내용은 [C\$1 Lambda 함수의 직렬화](csharp-handler.md#csharp-handler-serializer) 단원을 참조하세요. 이 단원은 Lambda 함수 코드를 적용하기 위해 편집할 수 있는 하나의 샘플 함수도 포함하고 있습니다.

  ```
  using Amazon.Lambda.Core;
  
  // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
  [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
  
  namespace myDotnetFunction;
  
  public class Function
  {
  
      /// <summary>
      /// A simple function that takes a string and does a ToUpper
      /// </summary≫
      /// <param name="input"></param>
      /// <param name="context"></param>
      /// <returns></returns>
      public string FunctionHandler(string input, ILambdaContext context)
      {
          return input.ToUpper();
      }
  }
  ```
+ **myDotnetFunction.csproj**: 애플리케이션을 구성하는 파일 및 어셈블리들의 목록을 열거한 [MSBuild](https://msdn.microsoft.com/en-us/library/dd393574.aspx) 파일입니다.

  ```
  <Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
      <TargetFramework>net8.0</TargetFramework>
      <ImplicitUsings>enable</ImplicitUsings>
      <Nullable>enable</Nullable>
      <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
      <AWSProjectType>Lambda</AWSProjectType>
      <!-- This property makes the build directory similar to a publish directory and helps the AWS .NET Lambda Mock Test Tool find project dependencies. -->
      <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
      <!-- Generate ready to run images during publishing to improve cold start time. -->
      <PublishReadyToRun>true</PublishReadyToRun>
    </PropertyGroup>
    <ItemGroup>
      <PackageReference Include="Amazon.Lambda.Core" Version="2.2.0" />
      <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.4.0" />
    </ItemGroup>
  </Project>
  ```
+ **Readme**: 이 파일을 사용하면 Lambda 함수를 문서화할 수 있습니다.

`myfunction/test` 디렉터리 아래에서 다음과 같은 파일들을 검사합니다.
+ **myDotnetFunction.Tests.csproj**: 앞서 언급한 것처럼 이것은 테스트 프로젝트를 구성하는 여러 파일 및 어셈블리를 열거한 [MSBuild](https://msdn.microsoft.com/en-us/library/dd393574.aspx) 파일입니다. 이 파일은 `Amazon.Lambda.Core` 라이브러리도 포함하고 있기 때문에 함수를 테스트하는 데 필요한 Lambda 템플릿을 원활하게 통합할 수 있습니다.

  ```
  <Project Sdk="Microsoft.NET.Sdk">
     ... 
  
      <PackageReference Include="Amazon.Lambda.Core" Version="2.2.0 " />
     ...
  ```
+ **FunctionTest.cs**: `src` 디렉터리에 포함된 것과 똑같은 C\$1 코드 템플릿 파일입니다. Lambda 함수를 프로덕션 환경에 업로드하기 전에 함수의 프로덕션 코드를 미러링하고 테스트할 수 있도록 이 파일을 편집합니다.

  ```
  using Xunit;
  using Amazon.Lambda.Core;
  using Amazon.Lambda.TestUtilities;
  
  using MyFunction;
  
  namespace MyFunction.Tests
  {
      public class FunctionTest
      {
          [Fact]
          public void TestToUpperFunction()
          {
  
              // Invoke the lambda function and confirm the string was upper cased.
              var function = new Function();
              var context = new TestLambdaContext();
              var upperCase = function.FunctionHandler("hello world", context);
  
              Assert.Equal("HELLO WORLD", upperCase);
          }
      }
  }
  ```

## .NET CLI를 사용하여 .NET 프로젝트 배포하기
<a name="csharp-package-cli-deploy"></a>

배포 패키지를 빌드하고 Lambda에 배포하려면 `Amazon.Lambda.Tools` CLI 도구를 사용합니다. 이전 단계에서 생성한 파일로 함수를 배포하려면 먼저 함수의 `.csproj` 파일이 포함된 폴더로 이동하십시오.

```
cd myDotnetFunction/src/myDotnetFunction
```

코드를 Lambda에.zip 배포 패키지로 배포하려면 다음 명령을 실행합니다. 자체 함수 이름을 선택하십시오.

```
dotnet lambda deploy-function myDotnetFunction
```

배포 중에 마법사는 [실행 역할로 Lambda 함수 권한 정의](lambda-intro-execution-role.md)을 선택하라고 요청합니다. 이 예제에서는 `lambda_basic_role`을(를) 선택합니다.

함수를 배포한 후 `dotnet lambda invoke-function` 명령을 사용하여 클라우드에서 테스트할 수 있습니다. `lambda.EmptyFunction` 템플릿에 있는 예제 코드의 경우 `--payload` 옵션을 사용하여 문자열을 전달하여 함수를 테스트할 수 있습니다.

```
dotnet lambda invoke-function myDotnetFunction --payload "Just checking if everything is OK"
```

함수가 성공적으로 배포된 경우 다음과 유사한 출력이 표시될 것입니다.

```
dotnet lambda invoke-function myDotnetFunction --payload "Just checking if everything is OK"
Amazon Lambda Tools for .NET Core applications (5.8.0)
Project Home: https://github.com/aws/aws-extensions-for-dotnet-cli, https://github.com/aws/aws-lambda-dotnet

Payload:
"JUST CHECKING IF EVERYTHING IS OK"

Log Tail:
START RequestId: id Version: $LATEST
END RequestId: id
REPORT RequestId: id  Duration: 0.99 ms       Billed Duration: 1 ms         Memory Size: 256 MB     Max Memory Used: 12 MB
```

## .NET CLI와 함께 Lambda 계층 사용
<a name="csharp-layers"></a>

**참고**  
.NET의 함수와 함께 [계층](chapter-layers.md)을 사용할 수 있지만 이는 권장되지 않습니다. 계층을 사용하는 .NET의 함수는 `Init` 단계 중 공유 어셈블리를 메모리에 수동으로 로드하므로 콜드 시작 시간을 늘릴 수 있습니다. 대신 컴파일 시간에 모든 공유 코드를 포함하여 .NET 컴파일러의 기본 제공 최적화를 활용하세요.

.NET CLI는 계층 게시 및 계층을 사용하는 C\$1 함수 배포에 도움이 되는 명령을 지원합니다. 지정된 Amazon S3 버킷에 계층을 게시하려면 .`.csproj` 파일과 동일한 디렉터리에서 다음 명령을 실행합니다.

```
dotnet lambda publish-layer <layer_name> --layer-type runtime-package-store --s3-bucket <s3_bucket_name>
```

그런 다음 .NET CLI를 사용하여 함수를 배포할 때 다음 명령에서 사용할 계층 ARN을 지정합니다.

```
dotnet lambda deploy-function <function_name> --function-layers arn:aws:lambda:us-east-1:123456789012:layer:layer-name:1
```

Hello World 함수의 전체 예제는 [blank-csharp-with-layer](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-csharp-with-layer) 샘플을 참조하세요.

# AWS SAM을 사용하여 C\$1 Lambda 함수 배포
<a name="csharp-package-sam"></a>

AWS Serverless Application Model(AWS SAM)은 AWS에서 서버리스 애플리케이션을 빌드하고 실행하는 프로세스를 간소화하는 데 도움이 되는 도구 키트입니다. YAML 또는 JSON 템플릿에서 애플리케이션의 리소스를 정의하고 AWS SAM Command Line Interface(AWS SAM CLI)를 사용하여 애플리케이션을 빌드, 패키징 및 배포합니다. AWS SAM 템플릿에서 Lambda 함수를 빌드하면 AWS SAM은(는) 함수 코드와 사용자가 지정하는 종속 항목을 사용하여 .zip 배포 패키지 또는 컨테이너 이미지를 자동으로 생성합니다. AWS SAM은(는) [CloudFormation 스택](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacks.html)을 사용하여 함수를 배포합니다. AWS SAM을 사용하여 Lambda 함수를 빌드하고 배포하는 방법에 대해 자세히 알아보려면 **AWS Serverless Application Model 개발자 안내서의 [Getting started with AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html)을 참조하세요.

다음 단계에서 AWS SAM을(를) 사용하여 샘플 .NET Hello World 애플리케이션을 다운로드, 빌드 및 배포하는 방법을 보여줍니다. 이 샘플 애플리케이션은 Lambda 함수와 Amazon API Gateway 엔드포인트를 사용하여 기본 API 백엔드를 구현합니다. API Gateway 엔드포인트에 HTTP GET 요청을 보내면 API Gateway가 Lambda 함수를 간접 호출합니다. 함수는 요청을 처리하는 Lambda 함수 인스턴스의 IP 주소와 함께 “hello world” 메시지를 반환합니다.

AWS SAM을(를) 사용하여 애플리케이션을 빌드하고 배포하면 AWS SAM CLI는 백그라운드에서 `dotnet lambda package` 명령을 사용하여 개별 Lambda 함수 코드 번들을 패키징합니다.

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

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

**AWS SAM CLI 버전 1.39 이상**  
AWS SAM CLI의 최신 버전을 설치하는 방법에 대해 알아보려면 [AWS SAM CLI 설치](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html)를 확인하십시오.

## 샘플 AWS SAM 애플리케이션 배포
<a name="csharp-package-sam-deploy"></a>

1. 다음 명령을 활용하는 Hello world .NET 템플릿을 사용하여 애플리케이션을 초기화합니다.

   ```
   sam init --app-template hello-world --name sam-app \
   --package-type Zip --runtime dotnet8
   ```

   이 명령은 프로젝트 디렉터리에 다음 파일 및 디렉터리를 생성합니다.

   ```
   └── sam-app
       ├── README.md
       ├── events
       │   └── event.json
       ├── omnisharp.json
       ├── samconfig.toml
       ├── src
       │   └── HelloWorld
       │       ├── Function.cs
       │       ├── HelloWorld.csproj
       │       └── aws-lambda-tools-defaults.json
       ├── template.yaml
       └── test
           └── HelloWorld.Test
               ├── FunctionTest.cs
               └── HelloWorld.Tests.csproj
   ```

1. `template.yaml file`이(가) 포함된 디렉토리로 이동합니다. 이 파일은 Lambda 함수 및 API Gateway API를 포함하여 애플리케이션의 AWS 리소스를 정의하는 템플릿입니다.

   ```
   cd sam-app
   ```

1. 애플리케이션의 소스를 빌드하려면 다음 명령을 실행합니다.

   ```
   sam build
   ```

1. AWS에 애플리케이션을 배포하려면 다음 명령을 실행합니다.

   ```
   sam deploy --guided
   ```

   이 명령은 다음과 같은 일련의 프롬프트와 함께 애플리케이션을 패키징하고 배포합니다. 기본 옵션을 그대로 사용하려면 입력 키를 누릅니다.
**참고**  
**HelloWorldFunction에 권한 부여가 정의되어 있지 않을 수도 있습니다. 괜찮습니까?**에 대해 `y`을(를) 입력합니다.
   + **스택 이름**: CloudFormation에 배포할 스택의 이름입니다. 이 이름은 AWS 계정 및 AWS 리전에 고유한 것이어야 합니다.
   + **AWS 리전**: 앱을 배포하려는 AWS 리전입니다.
   + **배포 전 변경 사항 확인**: AWS SAM이(가) 애플리케이션 변경 사항을 배포하기 전에 변경 세트를 수동으로 검토하려면 예를 선택합니다. 아니요를 선택하면 AWS SAM CLI가 애플리케이션 변경 사항을 자동으로 배포합니다.
   + **SAM CLI IAM 역할 생성 허용**: 이 예제의 Hello world 템플릿을 비롯한 많은 AWS SAM 템플릿은 AWS Identity and Access Management (IAM) 역할을 생성하여 Lambda 함수를 다른 AWS 서비스에 액세스할 수 있는 권한을 부여합니다. IAM 역할을 생성하거나 수정하는 CloudFormation 스택을 배포할 권한을 제공하려면 예를 선택합니다.
   + **롤백 비활성화**: 기본적으로 AWS SAM이(가) 스택을 생성하거나 배포하는 동안 오류가 발생하면 스택을 이전 버전으로 롤백합니다. 이 기본값을 허용하려면 아니요를 선택합니다.
   + **HelloWorldFunction에 권한 부여가 정의되어 있지 않을 수 있습니다. 괜찮습니까**: `y`을(를) 입력합니다.
   + **samconfig.toml에 인수 저장**: 구성 선택 사항을 저장하려면 예를 선택합니다. 앞으로는 파라미터 `sam deploy` 없이 다시 실행하여 변경 내용을 애플리케이션에 배포할 수 있습니다.

1. 애플리케이션 배포가 완료되면 CLI는 Hello World Lambda 함수의 Amazon 리소스 이름(ARN)과 이 함수에 대해 생성된 IAM 역할을 반환합니다. 또한 API Gateway API의 엔드포인트가 표시됩니다. 애플리케이션을 테스트하려면 브라우저에서 엔드포인트를 엽니다. 다음과 유사한 응답이 나타납니다.

   ```
   {"message":"hello world","location":"34.244.135.203"}
   ```

1. 다음 명령을 실행하여 리소스를 삭제합니다. 참고로 생성한 API 엔드포인트는 인터넷을 통해 액세스할 수 있는 퍼블릭 엔드포인트입니다. 테스트 후에는 이 엔드포인트를 삭제하는 것이 좋습니다.

   ```
   sam delete
   ```

## 다음 단계
<a name="csharp-package-sam-next"></a>

.NET을 사용하여 Lambda 함수를 빌드하고 배포하기 위해 AWS SAM을(를) 사용하는 방법에 대해 자세히 알아보려면 다음 리소스를 참조하십시오.
+ [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html)가이드
+ AWS Lambda 및 [SAM CLI를 사용하여 서버리스 .NET 애플리케이션 빌드하기](https://aws.amazon.com/blogs/dotnet/building-serverless-net-applications-with-aws-lambda-and-the-sam-cli/)

# AWS CDK을 사용하여 C\$1 Lambda 함수 배포
<a name="csharp-package-cdk"></a>

AWS Cloud Development Kit (AWS CDK)은(는) .NET과 같은 최신 프로그래밍 언어 및 프레임워크를 사용하여 클라우드 인프라를 코드로 정의하는 오픈 소스 소프트웨어 개발 프레임워크입니다. AWS CDK프로젝트를 실행하여 CloudFormation 템플릿을 생성한 다음 이를 사용하여 코드를 배포합니다.

AWS CDK을(를) 사용하여 예제 Hello world .NET 애플리케이션을 빌드하고 배포하려면 다음 섹션의 지침을 따르십시오. 샘플 애플리케이션은 API Gateway 엔드포인트와 Lambda 함수로 구성된 기본 API 백엔드를 구현합니다. 엔드포인트에 HTTP GET 요청을 보내면 API Gateway는 Lambda 함수를 간접 호출합니다. 함수는 요청을 처리하는 Lambda 인스턴스의 IP 주소와 함께 Hello world 메시지를 반환합니다.

## 사전 조건
<a name="csharp-package-cdk-prereqs"></a>

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

**AWS CDK 버전 2**  
AWS CDK의 최신 버전을 설치하는 방법을 알아보려면 *AWS Cloud Development Kit (AWS CDK) v2 개발자 안내서*의 [AWS CDK(으)로 시작하기](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)를 확인하십시오.

## 샘플 AWS CDK 애플리케이션 배포
<a name="csharp-package-cdk-deploy"></a>

1. 샘플 애플리케이션을 위한 프로젝트 디렉터리를 생성하고 탐색합니다.

   ```
   mkdir hello-world
   cd hello-world
   ```

1. 다음 명령을 실행하여 새 AWS CDK 애플리케이션을 초기화합니다.

   ```
   cdk init app --language csharp
   ```

   이 명령은 프로젝트 디렉터리에 다음과 같은 파일 및 디렉터리를 생성합니다

   ```
   ├── README.md
   ├── cdk.json
   └── src
       ├── HelloWorld
       │   ├── GlobalSuppressions.cs
       │   ├── HelloWorld.csproj
       │   ├── HelloWorldStack.cs
       │   └── Program.cs
       └── HelloWorld.sln
   ```

1. `src` 디렉터리를 열고 .NET CLI를 사용하여 새 Lambda 함수를 생성합니다. AWS CDK을(를) 사용하여 배포할 함수입니다. 이 예제에서는 `lambda.EmptyFunction` 템플릿을 사용하여 `HelloWorldLambda`(이)라는 Hello world 함수를 생성합니다.

   ```
   cd src
   dotnet new lambda.EmptyFunction -n HelloWorldLambda
   ```

   이 단계 후에 프로젝트 디렉터리 내부의 디렉터리 구조는 다음과 같아야 합니다.

   ```
   ├── README.md
   ├── cdk.json
   └── src
       ├── HelloWorld
       │   ├── GlobalSuppressions.cs
       │   ├── HelloWorld.csproj
       │   ├── HelloWorldStack.cs
       │   └── Program.cs
       ├── HelloWorld.sln
       └── HelloWorldLambda
           ├── src
           │   └── HelloWorldLambda
           │       ├── Function.cs
           │       ├── HelloWorldLambda.csproj
           │       ├── Readme.md
           │       └── aws-lambda-tools-defaults.json
           └── test
               └── HelloWorldLambda.Tests
                   ├── FunctionTest.cs
                   └── HelloWorldLambda.Tests.csproj
   ```

1. `src/HelloWorld` 디렉터리에서 `HelloWorldStack.cs` 파일을 엽니다. 파일의 내용을 다음 코드로 바꿉니다.

   ```
   using Amazon.CDK;
   using Amazon.CDK.AWS.Lambda;
   using Amazon.CDK.AWS.Logs;
   using Constructs;
   
   namespace CdkTest
   {
       public class HelloWorldStack : Stack
       {
           internal HelloWorldStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
           {
               var buildOption = new BundlingOptions()
               {
                   Image = Runtime.DOTNET_8.BundlingImage,
                   User = "root",
                   OutputType = BundlingOutput.ARCHIVED,
                   Command = new string[]{
               "/bin/sh",
                   "-c",
                   " dotnet tool install -g Amazon.Lambda.Tools"+
                   " && dotnet build"+
                   " && dotnet lambda package --output-package /asset-output/function.zip"
                   }
               };
   
                var helloWorldLambdaFunction = new Function(this, "HelloWorldFunction", new FunctionProps
               {
                   Runtime = Runtime.DOTNET_8,
                   MemorySize = 1024,
                   LogRetention = RetentionDays.ONE_DAY,
                   Handler = "HelloWorldLambda::HelloWorldLambda.Function::FunctionHandler",
                   Code = Code.FromAsset("./src/HelloWorldLambda/src/HelloWorldLambda", new Amazon.CDK.AWS.S3.Assets.AssetOptions
                   {
                       Bundling = buildOption
                   }),
               });
           }
       }
   }
   ```

   Lambda 함수 자체의 정의뿐만 아니라 애플리케이션 코드를 컴파일하고 번들링하는 코드입니다. `BundlingOptions` 객체를 사용하면 zip 파일의 콘텐츠를 생성하는 데 사용되는 명령 집합과 함께 zip 파일을 생성할 수 있습니다. 이 경우 `dotnet lambda package` 명령은 zip 파일을 컴파일하고 생성하는 데 사용됩니다.

1. 애플리케이션을 배포하려면 다음 명령을 입력합니다.

   ```
   cdk deploy
   ```

1. .NET Lambda CLI를 사용하여 배포된 Lambda 함수를 간접 호출하십시오.

   ```
   dotnet lambda invoke-function HelloWorldFunction -p "hello world"
   ```

1. 테스트를 마친 후 생성한 리소스를 보관하고 싶지 않다면 삭제해도 됩니다. 다음 명령을 실행하여 리소스를 삭제합니다.

   ```
   cdk destroy
   ```

## 다음 단계
<a name="csharp-package-cdk-next"></a>

.NET을 사용하여 Lambda 함수를 빌드하고 배포하기 위해 AWS CDK을(를) 사용하는 방법에 대해 자세히 알아보려면 다음 리소스를 참조하십시오.
+ [C\$1에서 AWS CDK 작업](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-csharp.html)
+ [AWS CDK를 사용하여.NET C\$1 Lambda 함수를 빌드, 패키징 및 게시합니다](https://aws.amazon.com/blogs/modernizing-with-aws/build-package-publish-dotnet-csharp-lambda-functions-aws-cdk/)

# 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
```