ディレクトリ構成

基本方針

environments/ディレクトリ配下に本番(prd)ステージング(stg)開発(dev)環境別テンプレートパラメータを配置し、templates/ディレクトリ配下の共通テンプレートをネストされたスタックまたはクロススタック参照で呼び出すことで、共通のインフラストラクチャ定義を複数環境で再利用しながら、環境固有のパラメータファイル(parameters.json)のみを変更することで環境差分を管理する、DRY原則に基づいたエンタープライズレベルのCloudFormation構成にする。

リソース管理の3原則

IAM権限の管理

各リソースに必要な実行ロールリソースベースポリシーは、各リソーステンプレート内で管理します。これにより、リソースと権限の密結合を実現し、権限の過不足防止とテンプレート単位での権限レビューを容易にする。

CloudWatch監視の管理

各リソースに必要なCloudWatch LogsCloudWatch Metricsは、各リソーステンプレート内で管理します。これにより、リソースとログ・メトリクスの一元管理を実現し、監視設定の漏れを防止する。

セキュリティリソースの管理

SGNACLWAFは一括管理します。これらは複数のリソース間で共有・参照されるため、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.jsonmain.yaml に渡すパラメータ値を定義
環境ごとに異なる値を管理
stack-policy.jsonルートスタック(main.yaml)全体の保護
本番環境での誤操作防止
deploy.shルートスタックとネストスタックを一括デプロイ
テンプレートの S3 アップロード
validate.shデプロイ前の事前チェック
構文エラーの早期発見
templates/*.yaml共通テンプレート
再利用可能なリソース定義