Amazon Web Services 한국 블로그

AWS Cloud Development Kit(CDK) – TypeScript 및 Python용 정식 버전 제공

코드 기반 인프라(Infra as Code, IaC) 관리는 데브옵스(DevOps) 프로세스를 성공적으로 적용하기 위한 발판입니다. 시스템 관리자와 개발자 모두 프로그래밍 가능한 인프라 구성 파일을 사용하여 애플리케이션에 필요한 컴퓨팅, 스토리지, 네트워크 및 애플리케이션 서비스의 프로비저닝을 자동화할 수 있습니다.

예를 들어, 코드 기반 인프라를 정의하면 다음이 가능해집니다.

  • 동일한 리포지토리에 인프라 및 애플리케이션 코드 보관
  • 서로 다른 환경, AWS 계정 및 AWS 리전에서 인프라 변경 사항을 반복 가능하고 예측 가능하게 설정
  • 연속 테스트를 활성화하도록 스테이징 환경에서 프로덕션 복제
  • 스트레스 테스트를 실행하는 데 필요한 시간 동안 사용하는 성능 테스트 환경에서 프로덕션 복제
  • 배포에 인프라 업데이트를 포함할 수 있도록 코드 변경과 동일한 도구를 사용하여 인프라 변경 사항 공개
  • 소규모 변경 사항 자주 배포 또는 코드 검토와 같은 인프라 관리에 소프트웨어 개발 모범 사례 적용

인프라를 관리하는 데 사용되는 구성 파일은 기존에 YAML 또는 JSON 텍스트 파일로 구현되었지만, 이 방법에서는 최신 프로그래밍 언어의 장점 대부분을 놓칠 수 있습니다. 특히 YAML에서는, 다른 시스템으로 전송 중인 동안 잘린 파일을 감지하거나 템플릿 간에 복사하고 붙여 넣을 때 누락된 행을 감지하기 어려울 수 있습니다.

선호하는 프로그래밍 언어의 뛰어난 성능을 사용하여 클라우드 인프라를 정의하는 편이 더 낫지 않을까요? 그래서, 작년에 AWS Cloud Development Kit(CDK)의 개발자 미리보기를 도입했습니다. 이 제품은 확장 가능한 오픈 소스 소프트웨어 개발 프레임워크로, 친숙한 프로그래밍 언어를 사용하여 클라우드 인프라를 모델링하고 프로비저닝할 수 있습니다.

AWS CDK for TypeScript/Python 정식 출시

AWS CDK를 사용하면 사용자만의 요구 사항을 통합하는 사용자 지정 구성 요소를 설계하고, 구성하고, 공유할 수 있습니다. 예를 들어, 연결된 라우팅 및 보안 구성을 통해 표준 VPC를 설정하는 구성 요소를 생성할 수 있습니다. 또는 AWS CodeBuildCodePipeline과 같은 도구를 사용하여 마이크로서비스에 대한 표준 CI/CD 파이프라인을 생성할 수 있습니다.

개인적으로, AWS CDK로 이 작업을 수행하길 좋아합니다. 여러분도 한 도구나 기술에서 다른 도구나 기술로 오가며 신경을 쓰기 않고도 최신 IDE가 기본 제공되는 자동 완성 및 파라미터 제안과 같은 지원과 함께 동일한 프로그래밍 언어를 사용하여 IDE에서 인프라를 포함하여 애플리케이션을 구축할 수 있습니다. AWS CDK를 사용하면 정말로 즐겁게 AWS 인프라를 빠르게 코딩하고, 구성하고, 애플리케이션 코드에 결합할 수 있습니다!

AWS CDK 작동 방식

AWS CDK의 모든 요소는 구문입니다. 여기서 구문이란, 복잡한 아키텍처를 표현할 수 있는 클라우드 구성 요소로 생각할 수 있습니다. 예를 들어, S3 버킷이나 SNS 주제, 정적 웹 사이트 또는 여러 AWS 계정이나 리전에 존재하는 복잡한 다중 스택 애플리케이션이 이에 해당합니다. 재사용성을 지원하기 위해 구문은 다른 구문을 포함할 수 있습니다. 구문은 AWS 환경에 배포할 수 있는 스택 및 하나 이상의 스택 모음인 으로 함께 구성합니다.

AWS CDK 사용 방법

AWS는 지속적으로 고객의 피드백에 기반하여 새로운 기능을 추가하고 있습니다. 그래서 AWS 리소스를 생성할 때 종종 많은 옵션과 종속 항목을 지정해야 합니다. 예를 들어, VPC를 생성하는 경우 사용할 AZ(가용 영역) 수와 VP에 배포할 리소스에 대한 프라이빗 및 퍼블릭 액세스를 제공하기 위해 서브넷을 구성하는 방법을 고려해야 합니다.

AWS 리소스의 상태를 쉽게 정의하기 위해 AWS Construct Library는 필요한 경우 사용자 지정할 수 있는 타당한 기본값을 사용하여 포괄적인 여러 AWS 서비스를 공개합니다. 위 경우, VPC 구문은 기본적으로 3개의 AZ를 사용하여 VPC의 모든 AZ에 대한 퍼블릭 및 프라이빗 서브넷을 생성합니다(지정하지 않은 경우 3개 AZ 사용).

CDK 앱을 생성하고 관리하는 경우 AWS CDK CLI(명령줄 인터페이스)를 사용할 수 있습니다. 이 도구는 Node.js가 필요한 명령줄 도구로 다음을 사용하여 빠르게 설치할 수 있습니다.

npm install -g aws-cdk

그 다음에, CDK CLI에서 다음과 같은 여러 명령을 사용할 수 있습니다.

  • cdk init – 지원되는 프로그래밍 언어 중 하나로 현재 디렉터리에서 새 CDK 프로젝트 초기화
  • cdk synth – 이 앱에 대한 CloudFormation 템플릿 인쇄
  • cdk deploy – AWS 계정에 앱 배포
  • cdk diff – 프로젝트 파일 콘텐츠와 배포된 내용 비교

cdk를 실행하면 사용 가능한 명령과 옵션에 대해 자세히 알아볼 수 있습니다.

예를 들어, Jenkins 또는 AWS CodeBuild를 사용하여 배포 자동화 워크플로에 CDK CLI를 간편하게 포함할 수 있습니다.

이제 AWS CDK를 통해 여러 프로그래밍 언어에서 2개의 샘플 프로젝트를 구축합니다.

TypeScript 예제

첫 번째 프로젝트에서는 TypeScript를 사용하여 인프라를 정의합니다.

cdk init app --language=typescript

다음은 구축하려는 프로젝트에 대한 간단한 보기입니다. VPC에서 퍼블릿/프라이빗 서브넷의 세부 정보를 입력하지 않았습니다. 온라인 프런트엔드에서는 큐에 메시지를 작성하고, 비동기 백엔드에서는 큐의 메시지를 소비합니다.

스택 내에서 다음 TypeScript 코드는 필요한 리소스와 해당 관계를 정의합니다.

  • 먼저 VPC를 정의하고 해당 VPC에서 Amazon ECS 클러스터를 정의합니다. AWS Construct Library에서 제공하는 기본값을 사용하면 여기에서 파라미터를 지정하지 않아도 됩니다.
  • 그런 다음, 몇 개 코드 행에서 Amazon SQS 큐를 설정하는 ECS 패턴을 사용하고, AWS Fargate에서 실행되는 ECS 서비스를 사용하여 해당 큐의 메시지를 소비합니다.
  • ECS 패턴 라이브러리에서는 로드 밸런싱된 서비스, 큐 처리 및 예약된 작업과 같은 공통 아키텍처 패턴을 따르는 상위 수준의 ECS 구문을 제공합니다.
  • Lambda 함수에는 ECS 패턴에서 생성하고, 환경 변수로 전달되는 큐의 이름이 있으며, 이 함수에는 큐에 메시지를 전송할 권한이 부여됩니다.
  • Lambda 함수 코드 및 도커 이미지는 애셋으로 전달됩니다. 애셋을 사용하면 프로젝트에서 파일이나 디렉터리를 번들로 생성하고 Lambda 또는 ECS에서 사용할 수 있습니다.
  • 마지막으로, Amazon API Gateway 엔드포인트는 함수에 HTTPS REST 인터페이스를 제공합니다.
const myVpc = new ec2.Vpc(this, "MyVPC");

const myCluster = new ecs.Cluster(this, "MyCluster", {
  vpc: myVpc
});

const myQueueProcessingService = new ecs_patterns.QueueProcessingFargateService(
  this, "MyQueueProcessingService", {
    cluster: myCluster,
    memoryLimitMiB: 512,
    image: ecs.ContainerImage.fromAsset("my-queue-consumer")
  });

const myFunction = new lambda.Function(
  this, "MyFrontendFunction", {
    runtime: lambda.Runtime.NODEJS_10_X,
    timeout: Duration.seconds(3),
    handler: "index.handler",
    code: lambda.Code.asset("my-front-end"),
    environment: {
      QUEUE_NAME: myQueueProcessingService.sqsQueue.queueName
    }
  });

myQueueProcessingService.sqsQueue.grantSendMessages(myFunction);

const myApi = new apigateway.LambdaRestApi(
  this, "MyFrontendApi", {
    handler: myFunction
  });

대응하는 JSON 또는 YAML보다 이 코드는 읽기도 쉽고 관리하기도 쉽습니다. 한편, 이 경우 cdk synth는 일반 CloudFormation YAML의 800개가 넘는 행을 출력합니다.

Python 예제

두 번째 프로젝트에서는 Python을 사용합니다.

cdk init app --language=python

10분마다 실행되는 Lambda 함수를 구축하려고 합니다.

Python에서 CDK 프로젝트를 초기화하는 경우 virtualenv는 자동으로 설정됩니다. virtualenv를 활성화하고 다음으로 프로젝트 필수 요소를 설치할 수 있습니다.

source .env/bin/activate

pip install -r requirements.txt

Python 자동 완성 기능은 활성 virtualenv에서 편집기를 시작하지 않으면 Visual Studio Code와 같은 일부 편집기에서 작동하지 않을 수 있습니다.

스택 내부에는 Lambda 함수 및 대상에서 정기적으로 함수를 호출하는 CloudWatch Event 규칙을 정의하는 Python 코드가 있습니다.

myFunction = aws_lambda.Function(
    self, "MyPeriodicFunction",
    code=aws_lambda.Code.asset("src"),
    handler="index.main",
    timeout=core.Duration.seconds(30),
    runtime=aws_lambda.Runtime.PYTHON_3_7,
)

myRule = aws_events.Rule(
    self, "MyRule",
    schedule=aws_events.Schedule.rate(core.Duration.minutes(10)),
)
myRule.add_target(aws_events_targets.LambdaFunction(myFunction))

이 코드 역시, AWS CDK 세부 정보를 알지 못해도 이해하기 쉽습니다. 예를 들어, 기간에는 시간 단위가 포함되므로, 초, 밀리초 또는 일 수 중 무엇으로 표현되는지 걱정하지 않아도 됩니다. 이 경우 cdk synth의 출력은 일반 CloudFormation YAML의 90개가 넘는 행입니다.

정식 출시

AWS CDK 사용 시 요금은 부과되지 않으며, 도구에서 배포하는 AWS 리소스에 대한 요금만 지불하면 됩니다. CDK를 빨리 체험해보고 싶다면, 이 멋진 단계별 온라인 자습서부터 시작해보십시오! 다음 리포지토리에서는 여러 프로그래밍 언어를 사용하는 CDK 프로젝트의 더 많은 예제를 이용할 수 있습니다.

https://github.com/aws-samples/aws-cdk-examples

더 자세한 것은 기술문서를 참고하시기 바랍니다. AWS CDK는 오픈 소스이므로, 더 나은 도구를 만들기 위해 여러분의 의견은 언제나 환영합니다.

https://github.com/awslabs/aws-cdk

GitHub에서 소스 코드를 확인하거나, TypeScript 또는 Python을 사용하여 오늘 인프라를 구축해보거나 개발자 미리보기에서 C# 및 Java와 같은 다른 언어를 사용해보고 여러분의 의견을 알려주십시오!

– Danilo Poccia, AWS 서버리스 전문 에반젤리스트