AWS CDK를 사용해 C# Lambda 함수 배포

AWS CDK를 사용해 C# Lambda 함수 배포 (Deploy C# Lambda functions using AWS CDK)

AWS Cloud Development Kit(AWS CDK)는 .NET 같은 현대 프로그래밍 언어와 프레임워크로 클라우드 인프라를 코드로 정의하기 위한 오픈소스 소프트웨어 개발 프레임워크예요. AWS CDK 프로젝트는 CloudFormation 템플릿을 생성하도록 실행되며, 이 템플릿이 코드를 배포하는 데 사용돼요.

출처: AWS Lambda 개발자 안내서

본문

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

사전 요구 사항 (Prerequisites)

**.**NET 8 SDK ****

.NET 8 SDK와 런타임을 설치해요.

**.**AWS CDK 버전 2 ****

최신 버전의 AWS CDK를 설치하는 방법은 AWS Cloud Development Kit (AWS CDK) v2 Developer Guide의 AWS CDK 시작하기를 참고하세요.

샘플 AWS CDK 애플리케이션 배포 (Deploy a sample AWS CDK application)

  1. 샘플 애플리케이션의 프로젝트 디렉터리를 만들고 들어가요.
    mkdir hello-world
    cd hello-world
    
  2. 다음 명령을 실행해 새 AWS CDK 애플리케이션을 초기화해요.
    cdk init app --language csharp
    
    이 명령은 프로젝트 디렉터리에 다음 파일과 디렉터리를 만들어요.
    ├── README.md
    ├── cdk.json
    └── src
        ├── HelloWorld
        │   ├── GlobalSuppressions.cs
        │   ├── HelloWorld.csproj
        │   ├── HelloWorldStack.cs
        │   └── Program.cs
        └── HelloWorld.sln
    
  3. 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
    
  4. 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 파일을 컴파일하고 생성해요.
  5. 애플리케이션을 배포하려면 다음 명령을 실행해요.
    cdk deploy
    
  6. .NET Lambda CLI를 사용해 배포된 Lambda 함수를 호출해요.
    dotnet lambda invoke-function HelloWorldFunction -p "hello world"
    
  7. 테스트를 마친 후 유지하려는 리소스가 아니면 만든 리소스를 삭제할 수 있어요. 리소스를 삭제하려면 다음 명령을 실행해요.
    cdk destroy
    

다음 단계 (Next steps)

AWS CDK를 사용해 .NET으로 Lambda 함수를 빌드하고 배포하는 방법에 대해 자세히 알아보려면 다음 리소스를 참고하세요.

더 알아보기 (Learn more)