Terraform

Terragrunt入門: TerraformをDRYに運用するための実務指針

2026-04-19
NicheeLab編集部

TerragruntはTerraformの実行を補助する軽量ラッパーで、モジュールの再利用、リモートステート設定の共通化、環境差分の管理をDRYに保つ狙いがあります。

試験対策の観点では、Terraformの公式機能(モジュール、バックエンド、状態管理、ワークスペース、CLI動作)を正しく理解することが最優先です。Terragruntは実務で役立ちますが、試験はTerraformの動作が出題の中心です。

Terragruntの立ち位置と試験範囲の切り分け

TerragruntはTerraform CLIを呼び出す補助ツールで、HCLで記述されたterragrunt.hclからモジュールの取得や入力変数の注入、共通設定の適用を行います。Terraform自体の状態管理やプラン・適用といったコア機能は、あくまでTerraformが担います。

Terraform Associate/Proレベルの試験は、バックエンド・状態ファイル・モジュール構成・ワークスペース・CLIの詳細挙動など公式機能の理解が前提です。Terragrunt固有の文法やサブコマンドは直接出題されにくく、出題されたとしてもTerraformの原理に基づいて判断できる内容に留まります。

  • DRYの主眼: ステートやプロバイダー設定等の共通化
  • Terraformの真実のソース: .tf / .tf.json と state(Terragruntは変更しない)
  • 試験ではTerraformのバックエンド、ロック、依存関係解決を重点復習

TerraformとTerragruntの役割比較(要点早見)

両者の責務を峻別すると設計がぶれません。Terraformはインフラ宣言と状態管理の“実行エンジン”。Terragruntはその呼び出しの“編成・共通化レイヤ”です。

以下は実務で迷いやすい論点の対比です。

  • 状態の正本はTerraformバックエンド(S3、GCS、AzureRM等)
  • 依存順序の実行や共通設定の差し込みはTerragruntで整理
  • プランの結果や適用の副作用はTerraformの責務
項目TerraformTerragrunt
役割宣言の評価・計画・適用、状態管理Terraform実行の編成とDRY化(共通設定・依存順)
設定単位.tf / .tfvars(モジュール単位)terragrunt.hcl(モジュールの呼び出し単位)
バックエンド/ロック公式バックエンド機能で管理共通化して各モジュールへ注入(自体はロックを提供しない)
依存関係モジュール間は出力/入力で間接的に接続dependency参照や実行順序の制御(呼び出し順)
CLIterraform init/plan/apply などterragrunt run-all / plan / apply(内部でterraformを実行)
差分管理変数・ワークスペース・ファイル分割locals・include・階層構造で環境差分を整理

ディレクトリ戦略と依存関係の表現

Terragruntでは“環境 × サービス × レイヤ(ネットワーク/データ/アプリ)”のように階層を切ると、共通化と差分の両立がしやすくなります。上位階層に共通のterragrunt.hclを置き、下位で必要最小の差分のみを記述します。

依存関係は、例えばネットワーク→データ→アプリの順で実行する設計にします。状態の正本は各モジュールのバックエンドにあり、Terragruntはその順序でterraformコマンドを呼ぶだけ、という切り分けを意識します。

  • 上位に共通localsとremote_state、下位でinputsとソース指定
  • 依存性は強すぎない粒度に分割(ネットワーク境界など)
  • run-allは便利だが、破壊的変更時は対象を絞って適用

環境階層と依存の一例

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]

terragrunt.hclの基本パターン(共通化と差分)

共通ファイルでリモートステートやプロバイダー設定を定義し、下位でモジュールソースとinputsのみを書くのが基本です。Terraformのバックエンド設定は、最終的に各モジュールのterraform initに反映されます。

以下はS3バックエンドを共通化し、モジュール変数を環境ごとに注入する最小パターンの例です。

  • remote_stateでバックエンド設定を共通化
  • terraform.sourceでモジュールの参照を一元管理
  • inputsで環境固有値を注入、localsで命名規約を統一

共通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では環境変数の引き回し、プラン出力の保存、承認ゲートの設計を徹底します。

  • バックエンドとロックはTerraformの機能に委ねる(DynamoDBロックなど)
  • providersはバージョン固定し、アップグレードは小さく刻む
  • 依存を深くしすぎない(循環・巨大グラフの回避)
  • planは人がレビューできる単位に分割、applyは最小権限のIDで実行
  • 状態操作(mv, rm, import)は必ずテスト環境で手順を固めてから

試験対策メモ(Pro向けの着眼点)

試験ではTerragrunt固有の文法より、Terraformの基礎力が問われます。特にバックエンドの初期化、状態の移行、ワークスペース、モジュールの設計、差分の解釈(plan出力の読み解き)を優先的に押さえましょう。

Terragruntで共通化していても、本質的には各モジュールの作業ディレクトリでterraform init/plan/applyが走る点を念頭に置けば、試験の設問に対して正しい判断ができます。

  • バックエンド変更時の手順(init -migrate-state等)の理解
  • state mv / import / rm の安全な適用順序
  • ワークスペースと変数ファイルの使い分け
  • モジュールの参照(registry/VC S)とバージョン固定の流儀
  • plan出力からのリスク評価(置換 vs 更新、破壊的変更)

問題で確認

Pro

問題 1

チームはTerragruntでS3バックエンド設定を共通化し、run-allで複数ディレクトリを順次applyしています。あるモジュールの状態からリソースを安全に切り離す(state rm)必要があります。Terraform Associate Proの観点で最も正しい対応はどれか。

  1. Terragruntの任意の上位ディレクトリでstate rmを実行すれば、配下すべての状態から自動的に除外される
  2. 対象モジュールの作業ディレクトリに移動してterraform state rmを実行し、バックエンドが指す該当stateのみに反映する
  3. S3バケットから該当のtfstateオブジェクトを手動削除すれば、terraform state rmは不要
  4. ワークスペースを切り替えれば、state rmの対象は自動で正しいstateに限定されるため、どこで実行しても問題ない

正解: B

state操作はTerraform CLIで対象状態ファイルに対して行います。Terragruntが共通化していても、最終的には各モジュールの作業ディレクトリで初期化されたバックエンドに紐づくstateが正本です。手動でS3オブジェクトを削除するのは危険で、ワークスペース切替も対象stateの選択を保証しません。

よくある質問

Terragruntを使うとTerraformのバックエンドやロック機構は変わりますか?

変わりません。バックエンドの種類・ロックはTerraformの機能です。Terragruntは共通化された設定を各モジュールのinitに行き渡らせる役割で、状態の整合性はTerraformが担います。

run-allで全環境を一度に適用しても安全ですか?

依存や影響範囲が明確で、planをレビュー済みであれば可能ですが、破壊的変更や広範囲の更新では段階的に適用するのが無難です。特に本番ではネットワークやデータ系から順に小さく適用してください。

Terraformの試験にTerragruntの知識は必要ですか?

直接問われる可能性は高くありません。試験はTerraformの公式機能(バックエンド、状態操作、モジュール、ワークスペース、CLI)を中心に出題されます。Terragrunt利用時も、これらの原則で判断できるように準備しましょう。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Terraform

Terraform HCL 構文の基礎:Block / Attribute / Expression を正しく使い分ける

Terraform Associate で頻出の HCL 構文を、ブロック・属性・式の3視点で整理。実務で迷いがちな書き...

Terraform

Terraform Authoring & Ops Pro: 上位資格の範囲と対策

上位レベルを想定したTerraformの設計・運用ドメインを整理し、実務で通用する対策を提示。モジュール設計、ステート運...

Terraform

Terraform Providers の基本: プラグイン型アーキテクチャを正しく使いこなす

Associate レベルで押さえるべき Provider の基礎、インストール、バージョニング、認証、エイリアス運用を...

Terraform

Terraform Resourceブロック徹底ガイド: 最小単位のリソース定義

Associateレベルで押さえるべきResourceブロックの構造、依存関係、メタ引数、ライフサイクル制御を実務目線で...

Terraform

Terraform Data Source徹底理解:既存リソースの参照で壊さず足す

Terraform Associate向けに、Data Sourceを用いた既存リソース参照の基本、選択基準、評価順序、...

Terraformの記事一覧 (101件)
© 2026 NicheeLab All rights reserved.