AWS CDK 란?

dev Jan 24, 2020

클라우드를 사용하는 어느 회사든 마찬가지겠지만, 회사에서 사용하는 클라우드에 대해 구성원이 숙련도가 높다면 인프라 구축 및 이슈 대응하는 데 있어 큰 도움이 된다. 본인도 근무했던 어느 회사보다 직방에서 AWS를 많이 경험하고 있으며, 이는 본인의 성장에도 도움이 되고 있다. 그렇다 보니 개인적으로도 AWS의 제품에 관심이 생겨 이것저것 실습을 하고 있다.

이번에는 직방에서 AWS CDK를 이용해 ECS 및 람다를 구축하고, 그 위에 애플리케이션을 배포한 경험을 몇 개의 글로 정리하려고 한다. 그 중에서도 오늘은 AWS CDK의 개념에 대해 공유하고자 한다.


AWS CDK?

AWS CDK(Cloud Development Kit)는 프로그래밍 언어를 사용하여 클라우드 애플리케이션 리소스를 모델링 및 프로비저닝 해주는 도구이다. AWS CDK를 사용하면 인프라를 코드로 정의하고 AWS CloudFormation을 통해 프로비저닝할 수 있다.

2020년 1월 24일 기준으로 TypeScript, Python, .Net, Java 4개의 언어로 지원하고 있다. 기존의 YAML 또는 JSON 형태의 선언적 접근 방식과는 달리 개발자에게 보다 친화적으로 본인의 주력 언어를 통해 작성할 수 있는 장점이 있다.

AWS CDK는 다음과 같이 구성되어있다.

그림 1. AWS CDK의 구성

그림 1과 같이 CDK는 앱, 스택, 구문(Construct)으로 구성 되어있으며, 다음과 같이 정의한다.

App

앱은 기본 구문이며, CDK CLI를 통해 AWS CloudFormation 템플릿을 렌더링하고 배포한다. 그리고 배포 가능한 단위인 하나 이상의 스택으로 구성되며 리전 및 계정에 대한 정보를 포함한다.

Stack

스택에는 AWS 람다, AWS ECS와 같이 AWS 리소스를 표현하는 구문이 포함된다.

Construct(구문)

구문은 그림 1과 같이 계층 구조를 가진다. AWS에서 구문은 3가지 레벨로 표현한다.

  • 레벨 1: AWS CloudFormation 리소스
    기존 리소스의 1대1 매핑이며 자동으로 생성된다. 선언적 접근 방식의 YAML 또는 JSON에서 사용하는 리소스와 동일하다.
  • 레벨 2: AWS 구문 라이브러리
    이러한 구문은 AWS 서비스 레벨에 위치하며, AWS가 직접 작성한 구문이다. 적절한 기본값이 설정되어 있으므로 세부 정보에 대한 큰 고민 없이 손쉽게 AWS 리소스를 생성할 수 있다.

    예를 들어 모든 가용 영역에 프라이빗 및 퍼블릭 서브넷을 갖춘 완전한 VPC를 생성하는 방법은 아래와 같다.
import ec2 = require('@aws-cdk/aws-ec2');

const vpc = new ec2.VpcNetwork(this, 'VPC');

  • 레벨 3: Your awesome stuff
    앞서 말한 것과 같이 구문은 계층 구조이다. 구문은 다른 구문을 기반으로 하는 상위 레벨의 추상화일 수도 있다. 예를 들어 이 레벨에서는 자동 노드 드레이닝, Auto Scaling 및 적합한 모든 경보를 포함하는 자체 AWS ECS 클러스터 구문을 작성할 수 있다. 또는 AWS RDS 데이터베이스가 모니터링해야 하는 모든 필수 경보에 대한 구문을 작성해도 된다.

    경험에 의하면 레벨 3은 레벨 2의 조합과 추가적인 옵션으로 이루어진다. AWS ECS를 예로 들면 로드밸런서, Task, Task Definition, Service와 같이 ECS를 구성하는데 있어서 필요한 레벨 2의 구문도 있지만, 위에서 설명한 것과 같이 입맛대로 필요한 옵션을 곁들일 수도 있다. 이런 조합을 구성해서 나만의 멋진 Stuff로 만들 수 있다는 것이다. 그리고 확장성을 고려해 구문을 작성한다면 어느 곳에든 공유하고 사용할 수 있게 된다.

위에서 설명한 App, Stack, Construct로 구성된 CDK Application은 그림 2와 같이 AWS CloudFormation을 통해 리소스가 생성된다.

그림 2. CDK Application 구성

정리

AWS CDK는 기존의 IaC(Infrastructure as Code)에서 제공하는 YAML 또는 JSON 형태의 선언적 접근 방식과는 개발자 친화적인 프로그래밍 언어로 되어있는 장점이 있다. 그리고 잘 만든 구문은 재사용성이 높기 때문에 생산성을 높아진다는 장점도 있다. 하지만 General Availability 된 지 6개월 정도밖에 되지 않아 레벨 2의 구문을 제공하지 않는 경우도 있으며, 콘솔에서 제공하는 옵션에 대해서 CDK에서 지원하지 않는 경우도 있다. 그러므로 아직까지는 AWS SDK와 함께 사용해야하는 번거로움이 있다.

cherrypick

체리픽이라는 단어 본연의 뜻은 안 좋은 의미이지만 저는 트렌디하고 많은 기술을 공부하고 내 거로 만들자는 뜻을 가지고 사용하고 있습니다.