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?

CloudFormation 460行 → CDK 200行。ALB + EC2 + RDSの3層構成をPythonで書き直した

0
Last updated at Posted at 2026-08-08

背景

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.jsoncontext にまとめ、コード内では 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.jsonmy_ip / key_name を確認

まとめ

CloudFormationのYAML約460行が、CDK(Python)では約200行に削減されました。コード量が減っただけでなく、cdk diff による差分確認やL2 Constructによる抽象化など、開発体験そのものが変わります。キーペア作成からデプロイ・動作確認・削除までの全手順はこちらにまとめています。

CDK版 ALB + EC2 + RDS 3層構成ハンズオン全手順(ブログ)

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?