☁️ 클라우드

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 변경 시 승인을 받도록 하세요.

🔗 관련 용어

📚 더 배우기