CloudFormationでWebSystemを自動化構築【VPC / ALB / EC2 / RDS / AutoScaling / SSM】
こんにちは。この記事では、AWS上に「Webアーキテクチャ(VPC → ALB → EC2 → RDS)」をCloudFormation(YAML)を使って完全自動構築する方法を紹介します。
CloudFormationとは?
CloudFormationは、AWSのリソース(VPC、EC2、ALB、RDSなど)をコード(YAML/JSON)で管理し、自動で作成・更新・削除できるサービス
特徴:
- GUIでのポチポチ作業不要
- 再利用可能なテンプレート
- 削除時には関連リソースもまとめて消せる(Stack単位で管理)
YAMLテンプレートとスタックとは?
- テンプレート:構成内容を定義するYAMLファイル
- スタック:テンプレートを元にAWS上に構築されたリソース群
たとえば、VPC・サブネットを定義した network-stack.yaml をCloudFormationにアップロードして実行すると、「networkスタック」として構築されます。
構成するAWSリソース
- VPC / サブネット / IGW / NAT Gateway
- ALB(Application Load Balancer)
- EC2(Apache + SSM)
- RDS(MySQL Multi-AZ)
- AutoScaling(EC2を自動スケーリング)
-
セキュリティグループで制御
*以前手動で作成した構成では、ターゲットグループへ手動でEC2を追加する必要があるため、AutoScalingを追加しEC2を自動でALBと接続する構成へ変更
アーキテクチャ図
★今回は自分でYAML形式のファイルを作成し、CloudFormationにデバイスからアップロードする方式です
★githubに作成済みのYAMLファイルを置いています。
(ページ下部にURL)
CloudFormationの操作手順
- AWSマネジメントコンソール → 「CloudFormation」
- 「スタックの作成」→「テンプレートファイルをアップロード」
-
.yamlファイルを選択して次へ - スタック名を入力(例:
NetworkStack) - タグ設定など、今回は特に不要であればそのまま
IAMロール関連で「IAMリソースを作成することを承認」が必要な場合あり(※IAM Roleを定義しているため)

RDSスタック作成時-
DBUsername:例admin -
DBPassword:例8文字以上
-
- 内容確認 → 「スタック作成」
- スタック作成中の状態確認
- CloudFormationの「スタック一覧」で
つけた名前を選択 - 「イベント」タブで進行状況がリアルタイム表示
-
CREATE_COMPLETEになれば成功!
作成が失敗しても、イベントタブから原因を表示してくれるので解消可
*一度失敗したスタックは削除が必要
補足:スタックを削除すると関連リソースも自動で削除されます。
スタック構成(分割例)
構成に依存関係があるため、分割して作成する場合は順に作成するのがおすすめです。
1. ネットワークスタック(VPC / Subnet / NAT Gateway)
2. セキュリティグループスタック
3. ALBスタック(ALB / TargetGroup / Listener)
- ALB をPublicSubnetに配置、ターゲットは後続のAutoScalingで連携
4. AutoScalingスタック(IAMロール、インスタンスプロファイル)
- EC2インスタンスをPrivateSubnetに2台起動
- Apache + MariaDB Client をUserDataでインストール
- SSM用 IAMスタック(SSM接続専用)
5. RDSスタック(MySQL / Multi-AZ)
- マルチAZ構成のMySQL。DBSubnetGroup、パスワードはパラメータ化
依存関係
| スタック名 | 内容 | 依存しているもの |
|---|---|---|
| ① ネットワークスタック | VPC / Subnet / IGW / NATGW | なし(最初に作成) |
| ② セキュリティグループ | 各リソース用SG | VPC(①) |
| ③ ALBスタック | ALB / TG / Listener | VPC、サブネット(①)、ALB-SG(②) |
| ④ EC2+SSM用IAM | SSM用IAMロール・インスタンスプロファイル | なし(③より前でもOK) |
| ⑤ AutoScalingスタック | EC2自動起動 / Apache設定 | サブネット(①)、EC2-SG(②)、IAM(④)、ターゲットグループ(③) |
| ⑥ RDSスタック | MySQL / Multi-AZ / SubnetGroup | サブネット(①)、RDS-SG(②) |
統合テンプレート(1ファイルにまとめる場合)
すべてを1ファイルに統合した形式。スタック1つで一括構築
#スタック削除で全リソースも削除可能
★Goal:動作確認チェックリスト
- EC2からSSM 接続できる(Session Manager)
- EC2 → RDS に
mysqlコマンドで接続できる
# EC2にSSMログイン後
mysql -h <RDSエンドポイント> -u admin -p
SHOW DATABASES;
- ブラウザで ALB のDNS名へアクセス
→Hello from <hostname>が表示される
削除時に注意するスタック順序
- RDS → AutoScaling → ALB → セキュリティグループ → ネットワーク
- スタックの出力値(
!Export)は、依存されている限り削除不可
分割スタック vs 統合テンプレート
| 比較項目 | 分割スタック | 統合テンプレート |
|---|---|---|
| 変更管理 | 部分ごとに管理しやすい | 全体を一括管理できる |
| 削除時の影響 | 他スタックに影響しづらい | 依存関係が複雑になる可能性 |
| 再利用性 | 再利用しやすい | 特定構成に最適化されがち |
| トラブル時の切り分け | 特定スタックで確認しやすい | 全体を巻き込む可能性あり |
★知見
Export と ImportValue の意味と使い方
CloudFormationでテンプレートを分割して複数のスタックに分けて管理する場合、スタックAで作成したリソースを、スタックBで使いたいことがあります。
たとえば:
- **NetworkStack(ネットワーク基盤)**で作成したVPC
- → EC2StackやALBStackなど別のテンプレートでも、そのVPCを使いたい!
という場面で使うのが、以下の二つです。
-
ExportのName:は AWSアカウント内で一意である必要があります。
Outputs + Export(→スタックA)
リソースのIDやARNを「他のスタックに渡すため」に外部に出しておく
Outputs:
VPCID:
Description: VPC ID
Value: !Ref VPC
Export:
Name: WebSystemVPCID
→ これを定義したスタックを作成すると、VPC IDが WebSystemVPCID という名前で「エクスポート」されます。
ImportValue(←スタックB)
エクスポートされた値を他のテンプレート内で利用できます:
VpcId: !ImportValue WebSystemVPCID
| CloudFormationでALBのターゲットにEC2を自動登録できない理由 |
|---|
TargetGroupにTargetsプロパティがCloudFormationで非対応だから |
| EC2のインスタンスIDは動的に決まる |
| AWSはASG経由での管理を推奨しているから |
GitHub
