

# .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) 샘플을 참조하세요.