1
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?

AWS構築練習!~ALB-EC2-RDS環境をIaC化~

Last updated at Posted at 2025-07-10

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と接続する構成へ変更

アーキテクチャ図

Diagram_Websystem_2.png


★今回は自分でYAML形式のファイルを作成し、CloudFormationにデバイスからアップロードする方式です

★githubに作成済みのYAMLファイルを置いています。

(ページ下部にURL)


CloudFormationの操作手順

  1. AWSマネジメントコンソール → 「CloudFormation」
  2. 「スタックの作成」→「テンプレートファイルをアップロード」
  3. .yaml ファイルを選択して次へ
  4. スタック名を入力(例:NetworkStack
  5. タグ設定など、今回は特に不要であればそのまま
    IAMロール関連で「IAMリソースを作成することを承認」が必要な場合あり(※IAM Roleを定義しているため)
    EC2Stack.png
    RDSスタック作成時
    • DBUsername:例 admin
    • DBPassword:例 8文字以上
  6. 内容確認 → 「スタック作成」
  7. スタック作成中の状態確認
  • 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 統合テンプレート

比較項目 分割スタック 統合テンプレート
変更管理 部分ごとに管理しやすい 全体を一括管理できる
削除時の影響 他スタックに影響しづらい 依存関係が複雑になる可能性
再利用性 再利用しやすい 特定構成に最適化されがち
トラブル時の切り分け 特定スタックで確認しやすい 全体を巻き込む可能性あり

★知見

ExportImportValue の意味と使い方

CloudFormationでテンプレートを分割して複数のスタックに分けて管理する場合、スタックAで作成したリソースを、スタックBで使いたいことがあります。

たとえば:

  • **NetworkStack(ネットワーク基盤)**で作成したVPC
  • EC2StackやALBStackなど別のテンプレートでも、そのVPCを使いたい!

という場面で使うのが、以下の二つです。

  • ExportName:AWSアカウント内で一意である必要があります。


OutputsExport(→スタック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

1
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
1
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?