학습 목표
AWS CDK(Cloud Development Kit) 가 일반 purpose 언어로 인프라를 정의하는 방식임을 설명할 수 있다.
App·Stack·Construct 계층과 부모-자식 관계를 설명할 수 있다.
synthesis가 CDK 코드를 CloudFormation template으로 바꾸는 과정임을 설명할 수 있다.
cdk synth·cdk deploy·cdk diff가 Terraform plan/apply와 어떻게 대응되는지 비교할 수 있다.
Terraform과 CDK의 상태·배포 엔진 차이를 개괄적으로 설명할 수 있다.
문제 상황
- CloudFormation YAML 3,000줄 —
!Ref·!GetAtt추적이 지옥 - VPC·RDS·Lambda를 복사 붙여넣기 — 파라미터 하나 바꿀 때 전 스택 diff
- 팀은 TypeScript인데 인프라는 JSON — 타입·리팩터링 불가
aws-cdk-lib예제를 돌렸는데cdk deploy전에 무슨 template이 나가는지 모름- Terraform state에 익숙한데 CDK는 CloudFormation stack만 보임 — 멱등·drift가 어디서?
- L1·L2·L3 construct가 뭔지 문서만 보고 막막 — 7편 예고만 읽음
- Part 1 Terraform으로 env·module 패턴을 잡았는데 — AWS만 고집할 때 CDK 언제 쓰나
Part 1에서 Terraform으로 HCL·state·module·환경 분리를 봤다. Part 2부터 AWS CDK — 언어로 인프라를 쓰고 CloudFormation으로 배포하는 축이다. L1/L2/L3·VPC 예제는 7편, Terraform 비교는 8편이다.
1. AWS CDK란?
- AWS CDK
- TypeScript·Python·Java·C#·Go 등으로 AWS 인프라를 정의
- 실행 시 CloudFormation template(JSON/YAML) 으로 synthesis
- 배포는 CloudFormation stack — AWS가 create/update/delete 오케스트레이션
- 왜 쓰나
- 추상화 —
ec2.Instance한 줄이 SG·AMI·IAM 조합을 캡슐 - 타입·IDE — 자동완성·컴파일 타임 오류
- 로직 — loop·조건·함수로 반복 인프라 (단, 과도한 런타임 로직은 지양)
- 추상화 —
| CloudFormation (raw) | AWS CDK | |
|---|---|---|
| 언어 | YAML/JSON | TS·Python 등 |
| 재사용 | nested stack·macro | Construct·library |
| 배포 | aws cloudformation deploy |
cdk deploy (CFn 호출) |
| 상태 | CloudFormation stack | 동일 (CDK는 state 파일 없음) |

CDK source (app.ts · app.py)
↓ cdk synth
CloudFormation template
↓ cdk deploy
CloudFormation stack (AWS resources)
- 선언적 철학은 Terraform과 같음 — 최종 스택 상태를 코드로
- 엔진이 다름 — Terraform state vs CDK CloudFormation
2. App · Stack · Construct
CDK 앱의 3계층.

App
- cdk.App — 프로그램 진입점, Stack들을 담는 루트
- 하나의 repo에 App 하나가 흔함 (여러 App도 가능)
Stack
- 단위 배포 — CloudFormation stack 1개와 1:1
- 경계 — lifecycle·IAM·rollback·삭제가 스택 단위
- env·팀·서비스별로 Stack 분리 (network stack, app stack)
Construct
- 리소스 묶음 — L1(저수준 CFn) ~ L3(패턴) — 7편
- 트리 — Construct는 parent·children;
this에new로 붙임 - scope — 첫 인자는 부모 Construct
// code/minimal-stack.example.ts
import * as cdk from "aws-cdk-lib";
import * as s3 from "aws-cdk-lib/aws-s3";
const app = new cdk.App();
class AppStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new s3.Bucket(this, "ArtifactsBucket", {
versioned: true,
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
}
}
new AppStack(app, "AppStack", {
env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION },
});
app.synth();
| 계층 | CloudFormation 대응 | 역할 |
|---|---|---|
| App | (없음 — CDK 전용) | synth 루트 |
| Stack | Stack | 배포·rollback 단위 |
| Construct | Resource·Nested 등 | 모듈화 단위 |
- Python도 동일 구조 —
aws_cdk·Stack·Bucket - construct id — 스택 내 유일; template의 logical ID 생성에 영향
3. Synthesis
synthesis — CDK 객체 트리 → CloudFormation template + asset manifest.
cdk synth # template을 stdout 또는 cdk.out/
cdk synth AppStack # 특정 stack만
- cdk.out/ — synth 결과물
AppStack.template.json— CloudFormation templatemanifest.json— stack·asset 메타- Lambda zip 등 asset 파일
- 변경 없이 synth만 — API 호출 없음 (Terraform
plan전 단계와 유사)
| 단계 | 하는 일 |
|---|---|
| Construct tree | App → Stack → 리소스 그래프 |
| Resolve | 토큰·lazy 속성 평가 |
| Emit | CFn template·asset 경로 기록 |
- Token — deploy 시점에야 알 수 있는 값 (
account,region) — template에 Ref/Fn::GetAtt로 남음 - Asset — S3에 업로드할 로컬 파일 (Lambda code, Docker image) — bootstrap stack 필요
4. Deploy · Diff · CloudFormation
cdk diff # template 변경 vs deployed stack 비교
cdk deploy # CloudFormation create/update
cdk destroy # stack 삭제

| CDK | CloudFormation / Terraform 대응 |
|---|---|
| cdk synth | template 생성 (TF: plan 전 HCL→graph) |
| cdk diff | changeset 미리보기 ≈ terraform plan |
| cdk deploy | stack update ≈ terraform apply |
| stack state | CFn이 보관 (TF state file) |
| drift | CFn drift detection (20편 TF drift와 비교) |
- bootstrap — 최초
cdk bootstrap으로 asset bucket·IAM 스택 생성 (계정·리전당) - rollback — CFn 실패 시 스택 롤백 (부분 실패 모드 설정 가능)
- 멱등 — 동일 template 재배포 시 no-op update
Terraform과 한눈에
| Terraform | AWS CDK | |
|---|---|---|
| 코드 | HCL | TS/Python |
| 엔진 | Terraform Core + provider | CloudFormation |
| 상태 | state (S3 등) | CFn stack |
| 멀티 클라우드 | 강함 | AWS 중심 |
| 추상화 | module | Construct L2/L3 |
- 8편에서 선택 기준 심화
5. 프로젝트 구조 (맛보기)
my-cdk-app/
├── bin/
│ └── app.ts # new App(), new Stack()
├── lib/
│ └── app-stack.ts # Stack·Construct 정의
├── cdk.json # app entry, context
├── package.json
└── cdk.out/ # synth 출력 (gitignore)
{
"app": "npx ts-node bin/app.ts",
"context": {
"@aws-cdk/core:stackRelativeExports": true
}
}
- cdk.json —
cdkCLI가 어떤 명령으로 App을 실행할지 - context — feature flag·env 고정값 (남용 주의)
- lib/ — Stack·Construct 재사용 (7편)
6. 실무에서 기억할 점
| 주제 | 이번 편 | 이후 |
|---|---|---|
| L1/L2/L3 | 언급만 | 7편 |
| VPC·IAM 예제 | 최소 S3 | 7편 |
| 테스트·snapshot | — | 9편 |
CI cdk deploy |
diff·deploy 명령 | 9·16편 |
| 멀티 env | env in StackProps |
tfvars 패턴과 유사 |
- Stack 쪼개기 — network / data / app — blast radius·권한
- construct id 변경 — 리소스 replace 유발 — Terraform force-replace와 유사
- synth in CI — PR에 template diff 검토 (9편)
정리
- CDK — 일반 언어로 인프라 → synth → CloudFormation
- App · Stack · Construct — 배포 단위는 Stack
- cdk synth / diff / deploy — template 생성·비교·스택 적용
- 상태 — Terraform state가 아니라 CloudFormation stack
- 7편 — L1/L2/L3·VPC·IAM hands-on
다음에 다룰 것
- CDK로 인프라 정의
- L1/L2/L3 construct, TypeScript·Python 예제, IAM·VPC
해당 내용은 AWS CDK Developer Guide (Core Concepts), AWS CloudFormation User Guide 를 기반으로 합니다.
'Infrastructure as Code' 카테고리의 다른 글
| CDK vs Terraform (0) | 2026.07.10 |
|---|---|
| CDK로 인프라 정의 (0) | 2026.07.09 |
| 환경과 Workspace (0) | 2026.07.05 |
| State와 Module (0) | 2026.07.03 |
| Terraform 기초 (0) | 2026.07.01 |