0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【IaC超入門】30日でAWS CloudFormationとTerraformをマスターするロードマップ - 12日目: AWS CDK(Cloud Development Kit)とは?CloudFormationとの違いを実例で理解する

0
Last updated at Posted at 2025-08-27

AWS CDK(Cloud Development Kit)とは?CloudFormationとの違いを実例で理解する

はじめに

これまでCloudFormationのベストプラクティスについて学んできましたが、YAMLでのリソース定義に限界を感じたことはありませんか?「同じような設定を何度も書くのが面倒」「条件分岐やループを使いたい」「IDEの補完機能を活用したい」といった要望に応えるのが、**AWS CDK(Cloud Development Kit)**です。

AWS CDKは、使い慣れたプログラミング言語でインフラを定義し、最終的にCloudFormationテンプレートを生成するフレームワークです。今回は、AWS CDKの概要と実際のコード例を通じて、CloudFormationとの違いを詳しく解説します。

AWS CDKとは?基本概念の理解

CDKの仕組み

AWS CDKは以下の流れでインフラをデプロイします:

CDKコード → CloudFormationテンプレート → AWSリソース
   ↓              ↓                    ↓
 TypeScript     YAML/JSON            EC2, S3など

つまり、CDKはCloudFormationの上位レイヤーとして機能し、プログラミング言語の力を借りてCloudFormationテンプレートの作成を効率化するツールです。

対応言語

CDKは複数のプログラミング言語をサポートしています:

  • TypeScript:最も機能が豊富で、CDKチームが最初にサポートする言語
  • Python:データサイエンスやML分野で人気
  • Java:エンタープライズ環境で広く使用
  • C#:.NET開発者向け
  • Go:軽量で高速なアプリケーション開発に適している

実例で比較:CloudFormation vs CDK

同じインフラ(VPC + EC2インスタンス)を両方の方法で記述して比較してみましょう。

CloudFormationの場合

AWSTemplateFormatVersion: "2010-09-09"
Description: "VPC and EC2 instance"

Parameters:
  InstanceType:
    Type: String
    Default: "t3.micro"
  KeyPairName:
    Type: AWS::EC2::KeyPair::KeyName

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: "10.0.0.0/16"
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: "MyVPC"

  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: "10.0.1.0/24"
      AvailabilityZone: !Select [0, !GetAZs ""]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: "PublicSubnet"

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: "MyIGW"

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: "PublicRouteTable"

  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: "0.0.0.0/0"
      GatewayId: !Ref InternetGateway

  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable

  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: "WebServerSG"
      GroupDescription: "Security group for web server"
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: "0.0.0.0/0"
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: "0.0.0.0/0"

  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref InstanceType
      ImageId: ami-0c02fb55956c7d316  # Amazon Linux 2023
      KeyName: !Ref KeyPairName
      SubnetId: !Ref PublicSubnet
      SecurityGroupIds:
        - !Ref SecurityGroup
      Tags:
        - Key: Name
          Value: "WebServer"

Outputs:
  InstanceId:
    Value: !Ref EC2Instance
  PublicIp:
    Value: !GetAtt EC2Instance.PublicIp

行数:約90行

AWS CDK(TypeScript)の場合

import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import { Construct } from 'constructs';

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

    // VPC作成(デフォルトで2つのAZに public/private サブネットが作成される)
    const vpc = new ec2.Vpc(this, 'MyVPC', {
      maxAzs: 2,
      cidr: '10.0.0.0/16'
    });

    // セキュリティグループ作成
    const securityGroup = new ec2.SecurityGroup(this, 'WebServerSG', {
      vpc: vpc,
      description: 'Security group for web server',
      allowAllOutbound: true
    });

    // インバウンドルール追加
    securityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80), 'HTTP');
    securityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22), 'SSH');

    // EC2インスタンス作成
    const instance = new ec2.Instance(this, 'WebServer', {
      vpc: vpc,
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO),
      machineImage: ec2.MachineImage.latestAmazonLinux2023(),
      keyName: 'my-keypair',
      securityGroup: securityGroup,
      vpcSubnets: {
        subnetType: ec2.SubnetType.PUBLIC
      }
    });

    // アウトプット
    new cdk.CfnOutput(this, 'InstanceId', {
      value: instance.instanceId
    });

    new cdk.CfnOutput(this, 'PublicIp', {
      value: instance.instancePublicIp
    });
  }
}

// アプリケーションエントリーポイント
const app = new cdk.App();
new WebServerStack(app, 'WebServerStack');

行数:約40行(半分以下!)

CDKの主要な利点

1. 高レベル構造(Constructs)

CDKでは、複数のAWSリソースを論理的にまとめた「Construct」を使用します。

// 1行でVPCと関連リソース(サブネット、ルートテーブル、IGWなど)を作成
const vpc = new ec2.Vpc(this, 'MyVPC', {
  maxAzs: 2  // 2つのAZに自動でサブネット作成
});

// CloudFormationでは20行以上必要だった設定が1行で完了

2. プログラミング言語の機能活用

条件分岐の例:

// 環境に応じてインスタンスタイプを変更
const instanceType = process.env.NODE_ENV === 'production' 
  ? ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MEDIUM)
  : ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO);

ループの例:

// 複数のS3バケットを動的に作成
const bucketNames = ['logs', 'backups', 'uploads'];
bucketNames.forEach(name => {
  new s3.Bucket(this, `${name}Bucket`, {
    bucketName: `myapp-${name}-${this.account}`,
    versioned: true,
    encryption: s3.BucketEncryption.S3_MANAGED
  });
});

3. 型安全性とIDE支援

// IDEでの自動補完とエラーチェック
const instance = new ec2.Instance(this, 'MyInstance', {
  instanceType: ec2.InstanceType.of(
    ec2.InstanceClass.T3,  // ← IDEで候補が表示される
    ec2.InstanceSize.MICRO // ← 型安全
  ),
  machineImage: ec2.MachineImage.latestAmazonLinux2023(),
  // 必須プロパティの抜け漏れもIDEが警告
});

4. テスタビリティ

CDKではユニットテストが書けます:

import { Template } from 'aws-cdk-lib/assertions';

test('VPC created', () => {
  const app = new cdk.App();
  const stack = new WebServerStack(app, 'TestStack');
  
  // CloudFormationテンプレートをテスト
  const template = Template.fromStack(stack);
  template.hasResourceProperties('AWS::EC2::VPC', {
    CidrBlock: '10.0.0.0/16'
  });
});

詳細比較表

項目 CloudFormation AWS CDK
学習コスト 低(YAML/JSON知識のみ) 中(プログラミング言語知識必要)
開発速度 遅い(冗長な記述) 速い(高レベル構造活用)
可読性 中(規模が大きくなると低下) 高(モジュール化可能)
再利用性 低(コピー&ペースト中心) 高(ライブラリとして共有可能)
デバッグ 困難(デプロイ時にしかエラーがわからない) 容易(IDEでのリアルタイムチェック)
バージョン管理 Git等で管理 npmパッケージとしても管理可能
テスト 困難 容易(ユニットテスト可能)
エコシステム AWS公式ドキュメント中心 豊富なサードパーティライブラリ

実際の開発ワークフロー比較

CloudFormationワークフロー

# 1. YAMLファイルを編集
vim template.yaml

# 2. デプロイしてエラーチェック
aws cloudformation deploy --template-file template.yaml --stack-name my-stack

# 3. エラーがあれば修正してもう一度デプロイ(時間がかかる)

CDKワークフロー

# 1. TypeScriptコードを編集(IDEで即座にエラーチェック)
code lib/my-stack.ts

# 2. ユニットテスト実行(高速)
npm test

# 3. CloudFormationテンプレートを生成して確認
cdk synth

# 4. デプロイ
cdk deploy

どちらを選ぶべき?判断基準

CloudFormationを選ぶべきケース

以下の条件に当てはまる場合:

  • チームがプログラミング経験に乏しい
  • シンプルな静的インフラのみ
  • 学習コストを抑えたい
  • AWS以外のクラウドプロバイダーも使用予定(Terraformを検討)

CDKを選ぶべきケース

以下の条件に当てはまる場合:

  • チームにプログラミング経験者がいる
  • 複雑で動的なインフラが必要
  • 複数環境(dev/staging/prod)を効率的に管理したい
  • インフラのテストを自動化したい
  • 社内でインフラコンポーネントを標準化・共有したい

学習ロードマップ

CloudFormation → CDKへの移行ステップ

  1. Phase 1: CloudFormationの基本を理解
  2. Phase 2: CDKの基本概念(Construct、Stack、App)を学習
  3. Phase 3: 既存のCloudFormationテンプレートをCDKで書き直してみる
  4. Phase 4: CDK独自の機能(テスト、カスタムコンストラクト)を活用

学習リソース

まとめ

AWS CDKは、プログラミング言語の柔軟性と型安全性を活かし、CloudFormationテンプレートの作成を劇的に効率化するツールです。学習コストはありますが、複雑なインフラの管理チーム間での再利用品質の担保という観点では大きなメリットがあります。

選択の指針:

  • 簡単な静的インフラ → CloudFormation
  • 複雑で動的なインフラ → CDK
  • 大規模チーム開発 → CDK

現代のクラウドインフラ開発において、CDKは避けて通れない重要な選択肢となっています。CloudFormationの基礎をしっかり理解した上で、次のステップとしてCDKにチャレンジすることをお勧めします。

次回は、これまでのCloudFormation学習の中間まとめとして、CloudFormationでできること、できないことについて解説します。お楽しみに!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?