概要
terraformのディレクトリ構成には正解はないですが、一例としてプロジェクトの要件に沿って作成したディレクトリ構成を紹介する。
要件
- 機能(コンポーネント)ごとにリリース作業が発生するのでtarget apply出来る構造にする
- 新たにコンポーネント、リソースを追加、または今後使われなくなったコンポーネント、リソース削除しやすい構造にする
- リソースに関しては、各コンポーネントのAPIGatewayのリソースパス(ルートパス、配下パスどちらも)、Lambda関数、Lambdaの環境変数、EventBridgeを想定する
- なるべくmodules間の依存がない構成とする(outputs.tfの煩雑を防ぐ)
ディレクトリ構成
ルートリポジトリ/
├── environments #dev/stg/prd環境ごとに作成
│ └── dev
│ ├── backend.tf
│ ├── common_main.tf # modules-mock、modules-dev-stgも含める
│ ├── component1_main.tf # modules-globalも含める
│ ├── component2_main.tf # modules-globalも含める
│ ├── component3_main.tf # modules-globalも含める
│ ├── component4_main.tf # modules-globalも含める
│ ├── component5_main.tf
│ ├── provider.tf
│ └── version.tf
│
│ └── stg
│ ├── backend.tf
│ ├── common_main.tf # modules-dev-stg、modules-tgwも含める
│ ├── component1_main.tf # modules-globalも含める
│ ├── component2_main.tf # modules-globalも含める
│ ├── component3_main.tf # modules-globalも含める
│ ├── component4_main.tf # modules-globalも含める
│ ├── component5_main.tf
│ ├── provider.tf
│ └── version.tf
│
│ └── prd
│ ├── backend.tf
│ ├── common_main.tf # modules-tgwも含める
│ ├── component1_main.tf # modules-globalも含める
│ ├── component2_main.tf # modules-globalも含める
│ ├── component3_main.tf # modules-globalも含める
│ ├── component4_main.tf # modules-globalも含める
│ ├── component5_main.tf
│ ├── provider.tf
│ └── version.tf
│
├── modules-common #各機能(component)共通で使うリソースを定義
│ ├── vpc.tf
│ ├── vpc_endpoint.tf # ゲートウェイ型、インターフェース型どちらのエンドポイントも共通化
│ ├── vpc_endpoint_private_subnet.tf # エンドポイント用のルートテーブル・サブネット共通化
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf #vpc情報のみ
│
├── modules-component1 #機能(compoent)1のリソースを定義
│ ├── route53.tf
│ ├── acm.tf
│ ├── apigw.tf
│ ├── waf.tf
│ ├── eventbridge.tf
│ ├── lambda.tf
│ ├── aurora.tf
│ ├── docdb.tf
│ ├── private_subnet.tf
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf # modules-component1-globalで利用するaurora/docdb情報
│
├── modules-component2 #機能(compoent)2のリソースを定義
│ ├── route53.tf
│ ├── acm.tf
│ ├── apigw.tf
│ ├── waf.tf
│ ├── lambda.tf
│ ├── docdb.tf
│ ├── private_subnet.tf
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf # modules-component2-globalで利用するdocdb情報
│
├── modules-component3 #機能(compoent)3のリソースを定義
│ ├── route53.tf
│ ├── acm.tf
│ ├── apigw.tf
│ ├── waf.tf
│ ├── eventbridge.tf
│ ├── sns.tf
│ ├── sqs.tf
│ ├── lambda.tf
│ ├── docdb.tf
│ ├── private_subnet.tf
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf # modules-component3-globalで利用するdocdb情報
│
├── modules-component4 #機能(compoent)4のリソースを定義
│ ├── route53.tf
│ ├── acm.tf
│ ├── apigw.tf
│ ├── waf.tf
│ ├── eventbridge.tf
│ ├── lambda.tf
│ ├── s3.tf
│ ├── neptune.tf
│ ├── private_subnet.tf
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf # modules-component4-globalで利用するneptune情報
│
├── modules-component5 #機能(compoent)5のリソースを定義
│ ├── route53.tf
│ ├── acm.tf
│ ├── alb.tf
│ ├── waf.tf
│ ├── ecs.tf
│ ├── private_subnet.tf # alb、ecs用
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf
│
├── modules-component1-global #機能(compoent)1のグローバルリソースを定義
│ ├── aurora.tf # グローバルクラスター・クラスター・インスタンス
│ ├── docdb.tf # グローバルクラスター・クラスター・インスタンス
│ ├── kms.tf
│ ├── secretsmanager.tf
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf
│
├── modules-component2-global #機能(compoent)2のグローバルリソースを定義
│ ├── docdb.tf # グローバルクラスター・クラスター・インスタンス
│ ├── kms.tf
│ ├── secretsmanager.tf
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf
│
├── modules-component3-global #機能(compoent)3のグローバルリソースを定義
│ ├── dynamodb.tf
│ ├── docdb.tf # グローバルクラスター・クラスター・インスタンス
│ ├── kms.tf
│ ├── secretsmanager.tf
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf
│
├── modules-component4-global #機能(compoent)4のグローバルリソースを定義
│ ├── kms.tf
│ ├── secretsmanager.tf
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf
│
├── modules-tgw #stg/prdのみに作成するtgwリソースを定義
│ ├── nlb.tf
│ ├── tgw.tf
│ ├── private_subnet.tf
│ ├── vpc.tf
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf
│
├── modules-mock #devのみに作成するmock用リソースを定義
│ ├── apprunner.tf
│ ├── ecs.tf
│ ├── ecr.tf
│ ├── private_subnet.tf
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf
│
├── modules-dev-stg #dev/stgのみに作成するリソースを定義
│ ├── alb.tf
│ ├── public_subnet.tf
│ ├── variables.tf
│ ├── locals.tf
│ └── outputs.tf
まとめ
元々はmodulesをあまり分割せずに作成していたが、要件に沿ってmodulesを適切に分割する事でoutputs.tfが少なくなり視覚的にも分かりやすく運用しやすいコード体系となった。