Infrastructure as Code

AWS CDK 개요

meellon 2026. 7. 7. 10:10

학습 목표

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; thisnew로 붙임
  • 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 template
    • manifest.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 updateterraform 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.jsoncdk CLI가 어떤 명령으로 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 — 일반 언어로 인프라 → synthCloudFormation
  • 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