
基本方針
environments/ディレクトリ配下に本番(prd)、ステージング(stg)、開発(dev)の環境別テンプレートとパラメータを配置し、templates/ディレクトリ配下の共通テンプレートをネストされたスタックまたはクロススタック参照で呼び出すことで、共通のインフラストラクチャ定義を複数環境で再利用しながら、環境固有のパラメータファイル(parameters.json)のみを変更することで環境差分を管理する、DRY原則に基づいたエンタープライズレベルのCloudFormation構成にする。
リソース管理の3原則
IAM権限の管理
各リソースに必要な実行ロールやリソースベースポリシーは、各リソーステンプレート内で管理します。これにより、リソースと権限の密結合を実現し、権限の過不足防止とテンプレート単位での権限レビューを容易にする。
CloudWatch監視の管理
各リソースに必要なCloudWatch Logs、CloudWatch Metricsは、各リソーステンプレート内で管理します。これにより、リソースとログ・メトリクスの一元管理を実現し、監視設定の漏れを防止する。
セキュリティリソースの管理
SG、NACL、WAFは一括管理します。これらは複数のリソース間で共有・参照されるため、templates/security/配下で集中管理することで、セキュリティポリシーの統一性とコンプライアンス要件への対応を容易にする。
project-root/
|
+- README.md
|
+- environments/ # 環境別のテンプレートとパラメータ
| |
| +- prd/ # 本番環境
| | |
| | +- main.yaml # 親テンプレート(ネストスタック構成)
| | +- parameters.json # 環境固有のパラメータ
| | +- stack-policy.json # スタックポリシー
| | |
| | +- deploy.sh # デプロイスクリプト
| | +- validate.sh # バリデーションスクリプト
| | |
| | +- user-data/ # ユーザーデータスクリプト
| | |
| | +- web-server-userdata.sh
| | +- app-server-userdata.sh
| |
| +- stg/ # ステージング環境
| | |
| | +- main.yaml
| | +- parameters.json
| | +- stack-policy.json
| | |
| | +- deploy.sh
| | +- validate.sh
| | |
| | +- user-data/
| | |
| | +- web-server-userdata.sh
| | +- app-server-userdata.sh
| |
| +- dev/ # 開発環境
| |
| +- main.yaml
| +- parameters.json
| +- stack-policy.json
| |
| +- deploy.sh
| +- validate.sh
| |
| +- user-data/
| |
| +- web-server-userdata.sh
| +- app-server-userdata.sh
|
+- templates/ # 共通テンプレート(ネストスタック用)
|
+- network/ # ネットワークレイヤー
| |
| +- vpc.yaml # VPC、Subnet、RouteTable、IGW、NAT GW
| +- README.md
|
+- security/ # セキュリティレイヤー
| |
| +- sg.yaml # 全てのSGを一括管理
| +- nacl.yaml # 全てのNACLを一括管理
| +- waf.yaml # Web ACL、保護対象との紐づけ
| +- README.md
|
+- compute/ # コンピューティングレイヤー
| |
| +- ec2.yaml # EC2インスタンス、IAMロール
| +- asg.yaml # 起動テンプレート、Auto Scaling、IAMロール
| +- alb.yaml # ALB、ターゲットグループ、リスナー
| +- README.md
|
+- database/ # データベースレイヤー
| |
| +- rds.yaml # RDS、サブネットグループ、パラメータグループ
| +- elasticache.yaml # ElastiCache、サブネットグループ、パラメータグループ
| +- dynamodb.yaml # DynamoDBテーブル
| +- README.md
|
+- container/ # コンテナレイヤー
| |
| +- ecs.yaml # クラスタ、タスク定義、サービス、IAMロール
| +- eks.yaml # クラスタ、ノードグループ、アドオン、IAMロール
| +- README.md
|
+- serverless/ # サーバーレスレイヤー
| |
| +- lambda.yaml # Lambda関数、IAMロール
| +- apigateway.yaml # API Gateway、統合、ルート、ステージ
| +- README.md
|
+- integration/ # 統合・メッセージングレイヤー
| +- sqs.yaml
| +- sns.yaml
| +- eventbridge.yaml
| +- stepfunctions.yaml
| +- README.md
|
+- storage/ # ストレージレイヤー
| |
| +- s3.yaml # S3バケット、バケットポリシー
| +- README.md
|
+- cdn/ # CDNレイヤー
| |
| +- cloudfront.yaml # ディストリビューション、キャッシュポリシー
| +- README.md
|
+- dns/ # DNSレイヤー
| |
| +- route53.yaml # Route53レコード定義、ホストゾーン
| +- acm.yaml # ACM証明書
| +- README.md
|
+- iam/ # IAMレイヤー(グローバルリソース)
| |
| +- users-and-groups.yaml # 管理者ユーザ、開発者ユーザ、グループ
| +- cross-account-roles.yaml # クロスアカウントロール
| +- README.md
|
+- monitoring/ # 監視レイヤー
|
+- cloudwatch-alarms.yaml # 横断的なアラーム
+- cloudwatch-dashboards.yaml # ダッシュボード
+- README.md
ファイル名
| 役割 | ファイル名 |
|---|---|
| main.yaml | ルートテンプレート 共通テンプレートを束ねる親テンプレート |
| parameters.json | main.yaml に渡すパラメータ値を定義 環境ごとに異なる値を管理 |
| stack-policy.json | ルートスタック(main.yaml)全体の保護 本番環境での誤操作防止 |
| deploy.sh | ルートスタックとネストスタックを一括デプロイ テンプレートの S3 アップロード |
| validate.sh | デプロイ前の事前チェック 構文エラーの早期発見 |
| templates/*.yaml | 共通テンプレート 再利用可能なリソース定義 |