Cloud Praticaのmodule戦略を、stg/prdの振り分け、TFTUIのstate表示、三項演算子、unit moduleまで一本につなげる。いま何をどこへ置き、なぜそうするのかを説明できる状態を目指す。
root module、child module、state、AWS実体は、それぞれ別の役割を持つ。

| 登場人物 | 置き場所・例 | 役割 |
|---|---|---|
| root module | stg/aws.tfprd/aws.tf | 環境ごとの入口。引数とbackendを決める |
| child module | modules/aws/ecr | 共通のresource定義を提供する |
| state | 環境別S3 backend | TerraformアドレスとAWS実体の対応を記録する |
| AWS実体 | ECR・VPCなど | 実際に稼働するクラウド資産 |
重要:同じディレクトリにある.tfファイル群は、Terraformからは1つのmoduleとしてまとめて読まれる。main.tfという名前自体に特別な魔法はない。
環境を自動判定するのではなく、実行するroot moduleとstateを明示的に分ける。

cloud-pratica-terraform/ ├── modules/aws/ecr/ │ ├── main.tf │ ├── variables.tf │ └── outputs.tf ├── stg/aws.tf └── prd/aws.tf
# stg/aws.tf module "ecr" { source = "../modules/aws/ecr" env = "stg" } # prd/aws.tf module "ecr" { source = "../modules/aws/ecr" env = "prd" }
誤解しやすい点:stgディレクトリでterraform applyしてもprdは動かない。ただし共有moduleを変更すると、次回のstg・prdそれぞれのplanで差分候補になるため、各環境で確認して順番に適用する。
ファイルをmodulesへ移す作業と、stateアドレスを移す作業は別物。

| 状態 | TFTUI表示 | planの傾向 |
|---|---|---|
| コードだけmodule化 | aws_ecr_repository.sample | 旧resource削除+module内resource作成 |
| stateも移動済み | module.ecr... | 設定が同じならNo changes |
moved { from = aws_ecr_repository.sample to = module.ecr.aws_ecr_repository.sample }
TFTUIが見ているもの:フォルダ構造ではなくstateアドレス。modules/を作っただけでmodule.ecr表示にはならない。
巨大moduleも深いネストも避け、探す場所と責任範囲を固定する。

| 設計 | 評価 | 理由 |
|---|---|---|
| 巨大main module | 避ける | targetが効きにくく、引数と環境分岐が増える |
| マイクロサービス単位 | 避ける | 共有VPCやRDSの置き場が曖昧になる |
| AWSサービス単位 | 基本 | 責任範囲と探す場所が明確 |
| unit module | 必要時のみ | 同じresource一式の反復をまとめる |
modules/
├── vpc/
├── subnet/
├── ec2/
├── ecr/
├── ecr_unit/ # ECR+policyの一式を反復するとき
├── rds/
└── rds_unit/
三項演算子は禁止ではない。環境差をどこに置くかが重要。

# 避けたい: 3環境目で意味が崩れる cpu = var.env == "stg" ? 300 : 1000 # 推奨: root moduleで意図を明示 module "ecs" { source = "../modules/aws/ecs" cpu = 300 } # 許容例: optional resourceの有無 count = var.enabled ? 1 : 0
| 選択肢 | 使いどころ | 注意点 |
|---|---|---|
| 自作module | VPC・ECR・EC2など | チーム固有の文脈を読みやすく保持 |
| public module | S3・CloudFrontなど設定量が多い場合 | version固定・互換性・更新追従が必要 |
最短の判断基準:まず自作のサービス単位module。反復が痛くなったらunit module。設定量が膨大ならpublic moduleを検討する。
No changesになること。