Mímisbrunnr知恵の泉

← クラウドインフラ 一覧

🎓 レベル:発展 | 重要度:B(推奨)

📎 前提:Terraformの基礎(HCL・state) | 関連:構成管理とImmutable InfrastructureGitOpsと自動化

要点(BLUF)

概念 ── 部品化と作り分け

小さなうちは1ファイルでも回りますが、資源が増え環境が増えると破綻します。解決は2方向。

flowchart TB
    mod["モジュール: web-service(VM+LB+NWの一式)"]
    mod -->|"変数: size=small, count=1"| dev["dev 環境(state-dev)"]
    mod -->|"変数: size=large, count=3"| prod["prod 環境(state-prod)"]

仕組み ── モジュールと変数

# modules/web-service/main.tf (部品の定義)
variable "instance_count" { type = number }
variable "machine_type"   { type = string }

resource "cloud_instance" "web" {
  count        = var.instance_count
  machine_type = var.machine_type
  name         = "web-${count.index}"
}

output "instance_ids" {
  value = cloud_instance.web[*].id
}
# environments/prod/main.tf (部品を呼び出す)
module "web" {
  source         = "../../modules/web-service"
  instance_count = 3          # prod は3台
  machine_type   = "large"
}
# environments/dev/main.tf
module "web" {
  source         = "../../modules/web-service"
  instance_count = 1          # dev は1台
  machine_type   = "small"
}

dev と prod は同じモジュール(同じ作り)に違う変数を渡すだけ。「dev で動いた構成が prod でも同じ形」になり、環境差バグが減ります(再現性=IaCとは・宣言的構成)。

仕組み ── state 分離と blast radius

環境ごと・コンポーネントごとに state を分けると、apply の影響範囲(爆発半径)が小さくなります。「ネットワークの変更で誤ってDBまで再作成」を防げる。

flowchart LR
    subgraph small["分割されたstate(影響が局所)"]
      s1["network/state"]
      s2["database/state"]
      s3["web/state"]
    end
    note["1つのapplyが触るのは1つのstateだけ → 事故が広がらない"]

なぜ分割するのか

⚠️ よくある誤解・落とし穴

対応ラボ

なし(設計トピック)。最小モジュール構成の雛形は Terraformの基礎(HCL・state) のローカルラボを modules/ に切り出して拡張すると体験できる。

関連

第5章 IaC 目次