terraform graphは、現在の構成や計画に基づく依存関係をDOT言語で出力し、Graphvizなどで画像化できる公式機能です。
試験では、依存解決の概念、-typeや-draw-cycles等のフラグの意味、可視化の活用場面が頻出です。実務では循環検出や作成/削除順序の検証に使います。
terraform graphは、Terraformが解決したリソース間の依存グラフをDOT形式で標準出力に書き出します。Graphvizのdotコマンドにパイプすれば、PNGやSVGの図として保存できます。挙動はTerraformの安定した基本機能に属し、CLIから再現性高く利用できます。
グラフは「作る順序」「壊す順序」「循環の有無」などの把握に有効です。大規模コードベースでは全体像の要点把握に役立ち、モジュール設計やdepends_onの必要性の再検討にも使えます。
最小手順(DOTをSVGに変換)
terraform graph | dot -Tsvg > graph.svg
# Graphvizが未導入なら、OSパッケージからインストール
# macOS: brew install graphviz
# Ubuntu/Debian: sudo apt-get install graphvizノードは主にresource、data、module、providerなどに対応します。エッジ(有向線)は依存方向を示し、上流のノードが準備できて初めて下流のノードが評価/作成されます。dataソースは読み取り専用で、通常はリソースから参照されます。
destroy(削除)時は依存の向きが逆転します。作成時に下流だったものが、削除時の上流になるため、削除順序を確かめる際は削除向けのグラフタイプを選びます。
典型的な依存の流れ(作成時)
# 解釈メモ:
# - instance.web は VPC(main) に依存
# - instance.web は AMI(data) を参照
# - EIP は instance.web に依存DOTファイルを中間生成してから閲覧する例
terraform graph -type=plan > plan.dot
dot -Tpng plan.dot -o plan.png
# 表示: open plan.png(macOS) あるいは xdg-open plan.png(Linux)作成や変更が想定どおりの順序になっていないと感じたら、まずグラフで依存を可視化します。明示的なdepends_onが不足していたり、属性参照が間接的な依存を作っているケースを発見できます。
循環依存が疑われる場合はサイクル強調を有効にし、問題の最小再現の単位までモジュール深度を絞って観察します。変更規模が大きいときは、まず上位モジュールの構造だけを見るのが効率的です。
循環強調とモジュール深度の例
terraform graph -draw-cycles -module-depth=1 | dot -Tsvg > shallow.svg
terraform graph -draw-cycles -module-depth=0 | dot -Tsvg > full.svg
# shallow.svg で俯瞰し、必要な箇所だけ full.svg を見る運用が現実的出力はDOTなので、Graphvizでレイアウトや形式を選べます。可読性を重視するならSVGを推奨します。拡大・検索が容易で、レビュー用の差分確認にも向きます。
グラフのタイプや補助フラグで、用途に合わせた可視化に切り替えます。削除順序の確認や循環の検出、段階的なモジュール展開などを組み合わせるのが実務的です。オプションの正確なラインアップや既定値はTerraformのバージョンにより変わる可能性があるため、使用中のバージョンの公式ドキュメントを都度確認してください。
| オプション | 可視化対象/意味 | 主な用途 | 注意点 |
|---|---|---|---|
| -type=plan | 計画時の依存(作成・変更の順序) | apply前の順序確認、想定外の依存の洗い出し | 状態・構成に依存。出力は時点の内容に左右される |
| -type=plan-destroy | 削除計画の依存(削除の安全な順序) | 破壊的変更やtear-downの事前確認 | 作成時と依存の向きが逆転する点に留意 |
| -draw-cycles | 循環依存の強調表示 | 複雑な設計のデバッグ、暗黙依存の洗い出し | 循環が解決できない場合は設計見直しが必要 |
| -module-depth=N | モジュール展開の深さを制御(0は全展開) | 大規模構成の段階的な俯瞰、レビューの簡素化 | 深さを絞ると詳細ノードが省略されることに注意 |
形式の切替とレビュー向け出力
# SVGで高解像度出力
terraform graph -type=plan | dot -Tsvg > plan.svg
# 削除計画の確認用
terraform graph -type=plan-destroy | dot -Tpng > destroy.png
# CIでアーティファクト化(例)
terraform graph -module-depth=1 | dot -Tsvg > overview.svgAssociateでは、依存解決の基本(明示的depends_onと暗黙の属性参照)、graphコマンドの目的、Graphvizによる可視化の流れが出やすいです。-draw-cyclesの意味を言い当てられること、出力がDOTであることも基本です。
Professionalでは、モジュール化や大規模構成での可視化方針、削除計画の検証、CI/CDパイプラインでのグラフ活用など、実務的な運用設計が問われやすくなります。
試験で押さえるべき基本コマンド
terraform graph -type=plan | dot -Tsvg > plan.svg
terraform graph -type=plan-destroy | dot -Tsvg > destroy.svg
terraform graph -draw-cycles -module-depth=1 | dot -Tsvg > cycles.svg非常に大きな構成では、フル展開のグラフは可読性が低下します。まずは-module-depthで階層を抑え、関心領域を特定したうえで深掘りするのが実践的です。
dataソースは作成対象ではないため、順序の根拠というよりは評価依存のヒントとして読みます。削除順序の把握には、必ずplan-destroy相当のグラフを確認しましょう。
バージョンにより細部の出力表現や既定値が変わることがあります。フラグや出力の意味解釈は、使用中のTerraformの公式ドキュメントで適宜確認してください。
対象を絞るテクニック(例)
# モジュール直下までで俯瞰
terraform graph -module-depth=1 | dot -Tsvg > overview.svg
# テキストDOTをgrepで簡易フィルタ(例: computeモジュール)
terraform graph > all.dot
grep -E "module.compute|cluster|aws_instance" all.dot > focus.dot
# 注意: 正規表現フィルタは簡易的。正式なフィルタ機構ではないAssociate / Pro
問題 1
削除時の依存順序を事前に確認し、安全にtear-downできるかを可視化したい。最も適切なコマンドはどれか?
正解: A
削除順序の確認には、削除計画に基づく依存を可視化する-type=plan-destroyが適切です。-draw-cyclesは循環強調、terraform show -jsonはDOTではなくJSON出力、validateにグラフ出力はありません。
terraform graphはJSONで出力できますか?
いいえ。terraform graphはDOT(Graphviz)形式を標準出力します。機械可読な出力が必要なら、terraform show -json(保存したplanやstateに対して)を検討してください。
Graphvizがなくても依存関係を確認できますか?
小規模ならDOTテキストを直接読むことも可能ですが、現実的にはGraphvizで画像化したほうがはるかに見やすく、レビューにも向きます。CIでSVGを生成して共有するのが実務的です。
特定のモジュールだけを個別に画像化できますか?
terraform graph自体にモジュール単位の分割出力はありません。-module-depthで展開を制御しつつ、DOTを後処理(grepやスクリプト)で抽出する運用が現実的です。大規模ならサブ構成に分けて局所的にgraphを取るのも有効です。
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を用いた既存リソース参照の基本、選択基準、評価順序、...