Terragrunt vs Terraform: Terragrunt が追加するもの
Terragrunt は Terraform の代替ではありません。繰り返しを減らし、リモートステートを標準化し、多数のモジュールをオーケストレーションする薄いラッパーです。小規模な構成なら素の Terraform で十分ですが、Terragrunt は規模が大きくなるとその価値を発揮します。
Terraform は宣言的な設定からインフラをプロビジョニングします。Terragrunt はその上に位置し、Terraform 単体では手作業に委ねられる繰り返しや複数環境のオーケストレーションを解決します。ここでは Terragrunt が追加するものと、その追加レイヤーがいつ価値を持つのかを説明します。
| Terragrunt | Terraform | |
|---|---|---|
| 何であるか | Terraform のラッパー | IaC ツールそのもの |
| DRY な設定 | 共有 input、generate ブロック | 環境ごとに繰り返し |
| リモートステート | 自動生成される backend 設定 | モジュールごとに手動 backend |
| 複数モジュール実行 | 依存関係をまたぐ run-all | モジュールごとの apply |
| 依存関係 | 明示的なモジュール依存関係 | 手動での順序付け |
| オーバーヘッド | 追加のツール + 概念 | 可動部分が少ない |
Terragrunt が実際に追加するもの
Terragrunt は Terraform を DRY に保ちます。backend や provider の設定を環境ごとにコピー & ペーストする代わりに、一度定義して生成します。また、モジュールごとにリモートステートを標準化し、依存関係を尊重しながら多数のモジュールをまとめて実行できます (run-all)。単一の小さなスタックにはどれも不要ですが、dev/stage/prod にまたがる数十のモジュールでは、多くのボイラープレートとドリフトを取り除きます。
ラッパーのコスト
Terragrunt はインストールし、学習し、Terraform (または OpenTofu) との互換性を保つ必要があるもう 1 つのツールです。その抽象化 (include、dependency、generate) は強力ですが間接性を加えるため、デバッグでは生成されたファイルについて推論することになる場合があります。予防的にではなく、繰り返しが本当の苦痛になったときに採用しましょう。
CI では
どちらも CLI ステップとして実行されます。Terragrunt の run-all plan/apply は多数のモジュールを依存関係の順序でパイプライン化でき、大規模な環境の CI に向いています。1 つのモジュールを 1 パイプラインで apply するなら素の Terraform の方がシンプルです。どちらの場合も provider プラグインのディレクトリを cache して init を高速化しましょう。
結論
小規模または単一スタックのインフラには素の Terraform を使い、繰り返し、リモートステートのボイラープレート、環境をまたぐ複数モジュールのオーケストレーションが苦痛になったら Terragrunt を追加しましょう。Terragrunt は Terraform を置き換えるのではなく補完します。