Terragrunt

OpenTofu / Terraform のラッパー。tf を置き換えず、実行前の下準備を代行する。 公式: https://docs.terragrunt.com/getting-started/overview

なぜ必要になるか

1 個の巨大な state は plan が遅く、壊したときの影響範囲が全部になる。だから state を分割する(VPC / EKS / RDS…、さらに dev / stg / prod)。

分割した瞬間、ディレクトリごとに同じものをコピペする羽目になる。

  • backend(state の保存先)設定
  • provider 設定
  • モジュールのバージョン指定

軸は「環境の数」ではなく「state の分割数」。dev/stg/prod はその一番よくある例にすぎず、単一環境でも state を 50 個に割れば同じ課題が出る。公式も自らを “orchestration tool” と定義している。

概念

  • Unit … terragrunt.hcl があるディレクトリ。state 1 個分=デプロイの最小単位
  • Stack … Unit の集まり(dev 環境まるごと等)
  • リポジトリは 2 分割推奨: モジュール本体(Git タグで管理)と live 設定(terragrunt.hcl のみ)

やってくれること

include "root" {                        # 共通設定を親から継承
  path = find_in_parent_folders("root.hcl")
}

terraform {                             # どのモジュールのどのバージョンか
  source = "git::git@github.com:org/infra-modules.git//vpc?ref=v1.2.0"
}

dependency "vpc" { config_path = "../vpc" }   # 依存を宣言 → 実行順を自動決定

inputs = {                              # 環境ごとの差分だけ書く
  vpc_id = dependency.vpc.outputs.vpc_id
}

使い始め方

既存の tf ディレクトリに空の terragrunt.hcl を置き、terraform の代わりに terragrunt を叩く。それだけで auto-init が効く。必要になった機能から足す。