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への移行ステップ
- Phase 1: CloudFormationの基本を理解
- Phase 2: CDKの基本概念(Construct、Stack、App)を学習
- Phase 3: 既存のCloudFormationテンプレートをCDKで書き直してみる
- Phase 4: CDK独自の機能(テスト、カスタムコンストラクト)を活用
学習リソース
- 公式ドキュメント: CDK Developer Guide
- ハンズオン: CDK Workshop
- サンプルコード: AWS CDK Examples
まとめ
AWS CDKは、プログラミング言語の柔軟性と型安全性を活かし、CloudFormationテンプレートの作成を劇的に効率化するツールです。学習コストはありますが、複雑なインフラの管理、チーム間での再利用、品質の担保という観点では大きなメリットがあります。
選択の指針:
- 簡単な静的インフラ → CloudFormation
- 複雑で動的なインフラ → CDK
- 大規模チーム開発 → CDK
現代のクラウドインフラ開発において、CDKは避けて通れない重要な選択肢となっています。CloudFormationの基礎をしっかり理解した上で、次のステップとしてCDKにチャレンジすることをお勧めします。
次回は、これまでのCloudFormation学習の中間まとめとして、CloudFormationでできること、できないことについて解説します。お楽しみに!