TerragruntはTerraformの実行を補助する軽量ラッパーで、モジュールの再利用、リモートステート設定の共通化、環境差分の管理をDRYに保つ狙いがあります。
試験対策の観点では、Terraformの公式機能(モジュール、バックエンド、状態管理、ワークスペース、CLI動作)を正しく理解することが最優先です。Terragruntは実務で役立ちますが、試験はTerraformの動作が出題の中心です。
TerragruntはTerraform CLIを呼び出す補助ツールで、HCLで記述されたterragrunt.hclからモジュールの取得や入力変数の注入、共通設定の適用を行います。Terraform自体の状態管理やプラン・適用といったコア機能は、あくまでTerraformが担います。
Terraform Associate/Proレベルの試験は、バックエンド・状態ファイル・モジュール構成・ワークスペース・CLIの詳細挙動など公式機能の理解が前提です。Terragrunt固有の文法やサブコマンドは直接出題されにくく、出題されたとしてもTerraformの原理に基づいて判断できる内容に留まります。
両者の責務を峻別すると設計がぶれません。Terraformはインフラ宣言と状態管理の“実行エンジン”。Terragruntはその呼び出しの“編成・共通化レイヤ”です。
以下は実務で迷いやすい論点の対比です。
| 項目 | Terraform | Terragrunt |
|---|---|---|
| 役割 | 宣言の評価・計画・適用、状態管理 | Terraform実行の編成とDRY化(共通設定・依存順) |
| 設定単位 | .tf / .tfvars(モジュール単位) | terragrunt.hcl(モジュールの呼び出し単位) |
| バックエンド/ロック | 公式バックエンド機能で管理 | 共通化して各モジュールへ注入(自体はロックを提供しない) |
| 依存関係 | モジュール間は出力/入力で間接的に接続 | dependency参照や実行順序の制御(呼び出し順) |
| CLI | terraform init/plan/apply など | terragrunt run-all / plan / apply(内部でterraformを実行) |
| 差分管理 | 変数・ワークスペース・ファイル分割 | locals・include・階層構造で環境差分を整理 |
Terragruntでは“環境 × サービス × レイヤ(ネットワーク/データ/アプリ)”のように階層を切ると、共通化と差分の両立がしやすくなります。上位階層に共通のterragrunt.hclを置き、下位で必要最小の差分のみを記述します。
依存関係は、例えばネットワーク→データ→アプリの順で実行する設計にします。状態の正本は各モジュールのバックエンドにあり、Terragruntはその順序でterraformコマンドを呼ぶだけ、という切り分けを意識します。
環境階層と依存の一例
live/
├─ prod/
│ ├─ networking/
│ │ └─ vpc/ (depends: none)
│ ├─ data/
│ │ └─ rds/ (depends: prod/networking/vpc)
│ └─ app/
│ ├─ ecs/ (depends: prod/networking/vpc, prod/data/rds)
│ └─ alb/ (depends: prod/networking/vpc)
└─ dev/
├─ networking/
│ └─ vpc/
└─ app/
└─ ecs/
関係:
[vpc] --> [rds] --> [ecs]
[vpc] --> [alb]
共通ファイルでリモートステートやプロバイダー設定を定義し、下位でモジュールソースとinputsのみを書くのが基本です。Terraformのバックエンド設定は、最終的に各モジュールのterraform initに反映されます。
以下はS3バックエンドを共通化し、モジュール変数を環境ごとに注入する最小パターンの例です。
共通terragrunt.hcl と 下位モジュールの例
# live/terragrunt.hcl(共通)
locals {
env = basename(get_terragrunt_dir()) # prod / dev など
name_prefix = "acme-${local.env}"
}
remote_state {
backend = "s3"
config = {
bucket = "acme-tfstate-${local.env}"
key = "${path_relative_to_include()}/terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "acme-tf-locks"
encrypt = true
}
}
# live/prod/networking/vpc/terragrunt.hcl(下位)
include "root" {
path = find_in_parent_folders()
}
terraform {
source = "git::https://example.com/iac-modules.git//aws/vpc?ref=v1.2.3"
}
inputs = {
name = "${local.name_prefix}-vpc"
cidr_block = "10.0.0.0/16"
}
# live/prod/app/ecs/terragrunt.hcl(依存の参照例)
dependency "vpc" {
config_path = "../../networking/vpc"
}
terraform {
source = "git::https://example.com/iac-modules.git//aws/ecs?ref=v1.2.3"
}
inputs = {
cluster_name = "${local.name_prefix}-ecs"
vpc_id = dependency.vpc.outputs.vpc_id
}
実務では“Terraformの原則を崩さない”ことが最優先です。ステートの正本性、ロック、計画と適用の一貫性を担保した上で、Terragruntで共通化と順序制御を加えます。
変更の影響範囲が大きい場合は、run-allで一気に適用するのではなく、影響の小さいディレクトリから順に検証します。CI/CDでは環境変数の引き回し、プラン出力の保存、承認ゲートの設計を徹底します。
試験ではTerragrunt固有の文法より、Terraformの基礎力が問われます。特にバックエンドの初期化、状態の移行、ワークスペース、モジュールの設計、差分の解釈(plan出力の読み解き)を優先的に押さえましょう。
Terragruntで共通化していても、本質的には各モジュールの作業ディレクトリでterraform init/plan/applyが走る点を念頭に置けば、試験の設問に対して正しい判断ができます。
Pro
問題 1
チームはTerragruntでS3バックエンド設定を共通化し、run-allで複数ディレクトリを順次applyしています。あるモジュールの状態からリソースを安全に切り離す(state rm)必要があります。Terraform Associate Proの観点で最も正しい対応はどれか。
正解: B
state操作はTerraform CLIで対象状態ファイルに対して行います。Terragruntが共通化していても、最終的には各モジュールの作業ディレクトリで初期化されたバックエンドに紐づくstateが正本です。手動でS3オブジェクトを削除するのは危険で、ワークスペース切替も対象stateの選択を保証しません。
Terragruntを使うとTerraformのバックエンドやロック機構は変わりますか?
変わりません。バックエンドの種類・ロックはTerraformの機能です。Terragruntは共通化された設定を各モジュールのinitに行き渡らせる役割で、状態の整合性はTerraformが担います。
run-allで全環境を一度に適用しても安全ですか?
依存や影響範囲が明確で、planをレビュー済みであれば可能ですが、破壊的変更や広範囲の更新では段階的に適用するのが無難です。特に本番ではネットワークやデータ系から順に小さく適用してください。
Terraformの試験にTerragruntの知識は必要ですか?
直接問われる可能性は高くありません。試験はTerraformの公式機能(バックエンド、状態操作、モジュール、ワークスペース、CLI)を中心に出題されます。Terragrunt利用時も、これらの原則で判断できるように準備しましょう。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Terraform HCL 構文の基礎:Block / Attribute / Expression を正しく使い分ける
Terraform Associate で頻出の HCL 構文を、ブロック・属性・式の3視点で整理。実務で迷いがちな書き...
Terraform Authoring & Ops Pro: 上位資格の範囲と対策
上位レベルを想定したTerraformの設計・運用ドメインを整理し、実務で通用する対策を提示。モジュール設計、ステート運...
Terraform Providers の基本: プラグイン型アーキテクチャを正しく使いこなす
Associate レベルで押さえるべき Provider の基礎、インストール、バージョニング、認証、エイリアス運用を...
Terraform Resourceブロック徹底ガイド: 最小単位のリソース定義
Associateレベルで押さえるべきResourceブロックの構造、依存関係、メタ引数、ライフサイクル制御を実務目線で...
Terraform Data Source徹底理解:既存リソースの参照で壊さず足す
Terraform Associate向けに、Data Sourceを用いた既存リソース参照の基本、選択基準、評価順序、...