背景
CloudFormationのYAMLで構築していたALB + EC2(Tomcat) + RDSの3層構成を、AWS CDK(Python)で再現しました。
インターネット
↓ HTTP(80)
[ALB] ← パブリックサブネット 2AZ
↓ HTTP(8080) ← SG-to-SG制御
[EC2: Tomcat] ← パブリックサブネット AZ-a
↓ MySQL(3306) ← SG-to-SG制御
[RDS: MySQL 8.0] ← プライベートサブネット AZ-a
同じ構成をコードで書き直してみて、変化が大きかった点をまとめます。
1. VPCまわりが ec2.Vpc 1行に集約される
CloudFormationではVPC・IGW・ルートテーブル・サブネットなどで15+リソースを個別に定義する必要がありましたが、CDKのL2 Constructを使うとこれが1行になります。
vpc = ec2.Vpc(
self, "Vpc",
max_azs=2,
nat_gateways=0,
subnet_configuration=[
ec2.SubnetConfiguration(name="Public", subnet_type=ec2.SubnetType.PUBLIC, cidr_mask=24),
ec2.SubnetConfiguration(name="Private", subnet_type=ec2.SubnetType.PRIVATE_ISOLATED, cidr_mask=24),
],
)
L1/L2/L3の区別で言うと、今回使っているのは主にL2(ec2.Vpc など、AWSのベストプラクティスを組み込んだ高レベル抽象)です。
| レベル | 説明 | 例 |
|---|---|---|
| L1 | CloudFormationリソースと1:1対応 | ec2.CfnVPC |
| L2 | ベストプラクティスを組み込んだ高レベル抽象 | ec2.Vpc |
| L3 | 複数サービスを組み合わせたパターン | ecs_patterns.ApplicationLoadBalancedFargateService |
2. SG-to-SG制御がメソッドチェーンで書ける
CloudFormationでは SourceSecurityGroupId: !GetAtt のような参照で書いていたセキュリティグループ間の許可設定が、CDKでは素直なメソッド呼び出しになります。
ec2_sg.add_ingress_rule(alb_sg, ec2.Port.tcp(8080), "ALB to EC2")
rds_sg.add_ingress_rule(ec2_sg, ec2.Port.tcp(3306), "EC2 to RDS")
3. cdk diff でデプロイ前に差分が自動で見える
CloudFormationでは変更セットを手動作成しないと差分確認ができませんでしたが、CDKは cdk diff 一発です。
cdk diff
Stack CdkAlbEc2RdsStack
Resources
[~] AWS::EC2::Instance EC2Instance
└─ [~] UserData
└─ [~] .Fn::Base64
└─ ...
コード変更 → cdk diff で影響範囲を確認 → cdk deploy という流れが、CloudFormationの変更セット作成より一段軽くなります。
4. パラメータ管理は cdk.json の context
環境依存の値(IPアドレス、DBパスワード、キー名など)は cdk.json の context にまとめ、コード内では self.node.try_get_context("key") で取得します。デプロイ時に上書きも可能です。
cdk deploy -c my_ip=1.2.3.4/32 -c db_password=MyPass123!
5. ハマったポイント
Amazon Linux 2023で mysql パッケージが見つからない
No match for argument: mysql
AL2023では mysql パッケージが存在しないため、mariadb105 を使う必要があります。
sudo dnf install -y mariadb105
ALBアクセスで502が返る
Tomcatの起動がEC2の起動完了より遅れるため、デプロイ直後は502になることがあります。3〜5分待ってからリトライすると解消します。
他にも詰まりやすいポイントの一覧です。
| 症状 | 原因 | 対処 |
|---|---|---|
cdk bootstrap が必要と言われる |
Bootstrap未実施 | 同一アカウント・リージョンで初回のみ cdk bootstrap を実行 |
ModuleNotFoundError: aws_cdk |
仮想環境が無効 |
.venv\Scripts\activate を実行してからCDKコマンドを再実行 |
| SSHできない |
my_ip かキー名が違う |
cdk.json の my_ip / key_name を確認 |
まとめ
CloudFormationのYAML約460行が、CDK(Python)では約200行に削減されました。コード量が減っただけでなく、cdk diff による差分確認やL2 Constructによる抽象化など、開発体験そのものが変わります。キーペア作成からデプロイ・動作確認・削除までの全手順はこちらにまとめています。