☁️ 클라우드

CDK

AWS Cloud Development Kit

AWS 리소스를 프로그래밍 언어로 정의하는 IaC 프레임워크. TypeScript, Python 등 지원.

📖 상세 설명

AWS CDK(Cloud Development Kit)는 TypeScript, Python, Java, C#, Go 등 익숙한 프로그래밍 언어로 AWS 인프라를 정의할 수 있는 오픈소스 IaC(Infrastructure as Code) 프레임워크입니다. 2019년 정식 출시 이후 CloudFormation의 대안으로 급성장했습니다.

CDK의 핵심은 'Construct'라는 추상화 계층입니다. L1(CloudFormation 리소스 1:1 매핑), L2(베스트 프랙티스 적용된 고수준 추상화), L3(여러 리소스 조합 패턴)로 구분됩니다. 예를 들어 L2의 ApplicationLoadBalancedFargateService 하나로 ALB, ECS Fargate, Target Group, Security Group을 한 번에 생성할 수 있습니다.

CDK 코드는 `cdk synth` 명령으로 CloudFormation 템플릿으로 변환되고, `cdk deploy`로 AWS에 배포됩니다. 따라서 CloudFormation의 모든 기능(Drift Detection, Rollback, Change Set 등)을 그대로 활용할 수 있습니다.

실무에서 CDK의 장점은 IDE 자동완성, 타입 체크, 반복문/조건문 사용이 가능하다는 점입니다. 300줄의 CloudFormation YAML이 50줄의 TypeScript로 줄어드는 경우가 많습니다. Construct Hub에서 커뮤니티 패턴을 재사용할 수도 있습니다.

💻 코드 예제

// CDK TypeScript - ECS Fargate 서비스 배포
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as ecsPatterns from 'aws-cdk-lib/aws-ecs-patterns';

export class MyServiceStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // VPC 생성 (NAT Gateway 포함)
    const vpc = new ec2.Vpc(this, 'MyVpc', {
      maxAzs: 2,
      natGateways: 1,
    });

    // ECS 클러스터 생성
    const cluster = new ecs.Cluster(this, 'MyCluster', {
      vpc,
      containerInsights: true,
    });

    // ALB + Fargate 서비스 (L3 Construct)
    const service = new ecsPatterns.ApplicationLoadBalancedFargateService(
      this, 'MyService', {
        cluster,
        cpu: 256,
        memoryLimitMiB: 512,
        desiredCount: 2,
        taskImageOptions: {
          image: ecs.ContainerImage.fromRegistry('nginx:latest'),
          containerPort: 80,
        },
        publicLoadBalancer: true,
      }
    );

    // Auto Scaling 설정
    const scaling = service.service.autoScaleTaskCount({
      minCapacity: 2,
      maxCapacity: 10,
    });
    scaling.scaleOnCpuUtilization('CpuScaling', {
      targetUtilizationPercent: 70,
    });

    // ALB DNS 출력
    new cdk.CfnOutput(this, 'LoadBalancerDNS', {
      value: service.loadBalancer.loadBalancerDnsName,
    });
  }
}

🗣️ 실무에서 이렇게 말하세요

💬 IaC 도구 선택 회의에서
"Terraform도 좋지만, 저희 팀이 TypeScript에 익숙하고 AWS만 쓰니까 CDK가 나을 것 같아요. IDE 자동완성으로 개발 속도가 빠르고, L2/L3 Construct로 보일러플레이트도 줄어듭니다. 결국 CloudFormation으로 변환되니까 안정성도 검증됐고요."
💬 면접에서
"CDK로 마이크로서비스 인프라를 관리했습니다. 서비스별로 Stack을 분리하고, 공통 VPC나 RDS는 Cross-Stack Reference로 참조했어요. cdk diff로 변경사항 리뷰하고, cdk deploy --hotswap으로 Lambda 빠르게 배포했습니다. Jest로 인프라 단위 테스트도 작성했고요."
💬 코드 리뷰에서
"여기 L1 Construct로 직접 정의하셨는데, L2 Construct 쓰면 Security Group이나 IAM Role이 자동으로 최소 권한으로 생성됩니다. ApplicationLoadBalancedFargateService로 바꾸면 코드가 절반으로 줄어요."

⚠️ 흔한 실수 & 주의사항

❌
Bootstrap 미실행

CDK는 배포 전 `cdk bootstrap` 명령으로 S3 버킷과 IAM Role을 생성해야 합니다. 리전마다 한 번씩 실행해야 하며, 이를 건너뛰면 "This stack uses assets, so the toolkit stack must be deployed" 에러가 발생합니다.

❌
Construct ID 변경으로 인한 리소스 재생성

CDK는 Construct ID를 기반으로 CloudFormation Logical ID를 생성합니다. ID를 변경하면 기존 리소스가 삭제되고 새로 생성됩니다. 프로덕션 DB나 S3처럼 데이터가 있는 리소스는 특히 주의하세요.

✅
올바른 접근법

`cdk diff`로 항상 변경사항을 확인하고 배포하세요. Stateful 리소스(RDS, DynamoDB 등)는 RemovalPolicy.RETAIN을 설정하고, 프로덕션은 `--require-approval broadening` 옵션으로 IAM 변경 시 승인을 받도록 하세요.

🔗 관련 용어

📚 더 배우기