AWS CDK(Cloud Development Kit)는 TypeScript, Python, Java 등 익숙한 프로그래밍 언어로 AWS 인프라를 정의할 수 있는 오픈소스 IaC 프레임워크입니다. CDK로 작성한 코드는 내부적으로 CloudFormation Template(YAML/JSON)으로 변환(synth)되어 배포됩니다. CloudFormation의 선언형 YAML 문법 대신 일반 프로그래밍 언어를 사용하므로, 반복문·조건문·함수 추상화 등 언어의 모든 기능을 인프라 정의에 활용할 수 있습니다.
| 항목 | CloudFormation | AWS CDK |
|---|---|---|
| 작성 방식 | YAML / JSON 선언형 | TypeScript 등 프로그래밍 언어 |
| 추상화 | 낮음 (모든 속성을 직접 작성) | 높음 (Construct 라이브러리 제공) |
| 재사용 | 복잡 (중첩 스택, 매크로 필요) | 쉬움 (클래스·함수로 추상화) |
| 배포 결과물 | YAML Template 자체 | CDK → CloudFormation Template → 배포 |
| 학습 곡선 | 낮음 (단순 선언) | 중간 (언어 + CDK 개념) |
CDK는 CloudFormation 위에서 동작하므로, 배포 결과는 여전히 CloudFormation Stack으로 관리됩니다. CDK 고유의 배포 방식이 아니라 CloudFormation의 안정성을 그대로 활용합니다.
Construct는 CDK의 기본 빌딩 블록입니다. 하나 이상의 AWS 리소스를 추상화한 클래스입니다. CDK 라이브러리(aws-cdk-lib)에는 S3 버킷, Lambda 함수, VPC 등을 표현하는 수백 가지 Construct가 미리 정의되어 있습니다.
Construct는 세 가지 레벨로 구분합니다.
ApplicationLoadBalancedFargateService는 ALB + ECS + IAM을 한 번에 생성합니다.Stack은 CDK에서 배포의 단위입니다. 하나의 Stack은 하나의 CloudFormation Stack에 대응됩니다. Stack 안에 Construct를 추가하여 필요한 리소스를 구성합니다.
App은 CDK 애플리케이션의 루트 진입점입니다. 하나의 App에 여러 Stack을 포함할 수 있습니다.
CDK App
|
+--- Stack: NetworkStack
| +--- VPC (L2 Construct)
| +--- Subnets (자동 생성)
|
+--- Stack: AppStack
+--- Lambda Function (L2 Construct)
+--- API Gateway (L2 Construct)
+--- S3 Bucket (L2 Construct)
import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { Construct } from 'constructs';
export class MyAppStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// S3 버킷 생성 (L2 Construct)
const bucket = new s3.Bucket(this, 'MyBucket', {
versioned: true,
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
// Lambda 함수 생성 (L2 Construct)
const fn = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
environment: {
BUCKET_NAME: bucket.bucketName,
},
});
// Lambda에 S3 읽기 권한 부여 (메서드 체이닝)
bucket.grantRead(fn);
}
}
위 코드에서 bucket.grantRead(fn) 한 줄이 IAM Policy 생성과 역할 연결을 자동으로 처리합니다. CloudFormation YAML로 직접 작성하면 수십 줄이 필요한 작업입니다.
cdk init app --language typescript # 프로젝트 초기화
cdk synth # CloudFormation Template 생성 (미리보기)
cdk diff # 현재 배포 상태와 코드 차이 확인
cdk deploy # 실제 배포
cdk destroy # Stack 및 리소스 삭제
CDK는 인프라를 코드로 관리하고 싶지만 YAML의 장황함이 불편한 팀에게 적합한 선택입니다. 특히 여러 환경(dev/prod)에 동일한 구조를 반복 배포하거나, 공통 인프라 패턴을 내부 라이브러리로 추상화해야 하는 경우에 강점을 발휘합니다.