Terraformで原因不明の失敗や差分の謎に直面したとき、TF_LOG系の環境変数で詳細ログを出すのが基本です。
ただしログ量は膨大になりがちで、設定や取り扱いを誤ると調査が長引いたり機密情報が漏れたりします。本稿では安全なログ取得手順、読み解きの勘所、試験で問われやすい論点を実務目線で整理します。
Terraformは環境変数TF_LOGで詳細ログを有効化できます。値はTRACE, DEBUG, INFO, WARN, ERRORで、下位ほど冗長です。通常のトラブルシュートはDEBUG、深掘りが必要なときのみTRACEが目安です。ログは標準エラーに出力されますが、TF_LOG_PATHを使うとファイルに書き出せます。
より細かく制御したい場合は、TF_LOG_CORE(Terraformコア)とTF_LOG_PROVIDER(プロバイダ・プラグイン)を使います。未設定の部分はTF_LOGの設定が既定として適用され、個別に設定した方が優先されます。詳細ログにはAPIリクエストなどの断片が含まれることがあり、取り扱いには注意が必要です。
| 環境変数 | 対象範囲 | 主な用途 | 注意点 |
|---|---|---|---|
| TF_LOG | コア+プロバイダ全体 | 手早く全体像を把握 | 未設定部分の既定値としても機能 |
| TF_LOG_CORE | Terraformコア処理 | 状態遷移/差分計算/バックエンド周りの追跡 | 設定するとコアはこれが優先 |
| TF_LOG_PROVIDER | プロバイダ・プラグイン | API呼び出しや属性マッピングの追跡 | 設定するとプロバイダはこれが優先 |
| TF_LOG_PATH | 出力先ファイル | ログのファイル保存 | 既存ファイルに追記される(ローテーションは自前で) |
Terraform詳細ログの流れ(どこで何が出るか)
基本の有効化(Linux/macOS, Windows)
# Linux/macOS
export TF_LOG=DEBUG
export TF_LOG_PATH=./terraform-debug.log
terraform plan
# Windows (PowerShell)
$env:TF_LOG = "DEBUG"
$env:TF_LOG_PATH = "./terraform-debug.log"
terraform plan
# 終了後は無効化
unset TF_LOG TF_LOG_PATH # PowerShell: Remove-Item Env:TF_LOG, Env:TF_LOG_PATHまずは再現性のある最小ディレクトリでDEBUGレベルのログを取り、問題の切り分けを進めます。TRACEは最終手段で、必要箇所の直前に切り替えると読みやすさが保てます。
CI/CDではジョブごとにTF_LOG_PATHを分け、ログローテーションや保持期間を明確にします。カラー出力は-no-colorで抑制できます(ログの可読性向上)。
再現ログの標準手順(Bash例)
set -euo pipefail
export TF_LOG=DEBUG
export TF_LOG_PATH="./repro-$(date +%Y%m%d-%H%M%S).log"
terraform init -upgrade
terraform plan -no-color
# 問題がplanに出ない場合のみapply前に必要箇所だけTRACE
export TF_LOG=TRACE
terraform apply -refresh-only -no-color # 影響を最小化して差分だけ確認
# 片付け
env -u TF_LOG -u TF_LOG_PATH true >/dev/null 2>&1 || trueログは時系列で読み、まずエラー直前のWARN/ERRORを起点に周辺のDEBUG行を遡ると因果を特定しやすくなります。プロバイダ呼び出しはリソースアドレス(例:module.db.aws_db_instance.this)やRPC方向(request/response)の相関を手がかりにします。
差分が期待と異なる場合は、計画フェーズでのUnknown値の扱い(computed属性)や、読み込み後の正規化(plan後のrefresh/plan再実行)に注目します。冗長なTRACEはgrepで間引き、関心リソースの行だけ抽出して芯を追います。
ログの絞り込み例(grep/awk)
# リソースアドレスで絞り込み
grep -F "module.db.aws_db_instance.this" terraform-debug.log | less
# レベルと時刻で周辺を確認
awk '/ERROR|WARN|DEBUG/ {print}' terraform-debug.log | less
# request/responseの対を確認
grep -E "(request|response)" terraform-debug.log | grep aws_db_instance | lessコアは落ち着いているが、API層で異常が疑われる場合はTF_LOG_PROVIDERだけDEBUG/TRACEに上げ、TF_LOG_COREはINFOまたはWARNに抑えるとノイズが減ります。これで差分計算の詳細は抑えつつ、HTTP相当のやり取りや属性反映の流れを重点的に追えます。
WindowsやCIでは一時的にスコープを切り替えて、問題箇所の直前と直後だけ高レベルにすることでログ肥大化を防げます。
スコープ別ログ制御(PowerShellとBash)
# PowerShell
$env:TF_LOG_CORE = "WARN"
$env:TF_LOG_PROVIDER = "DEBUG"
$env:TF_LOG_PATH = "./provider-only.log"
terraform plan
# Bash
export TF_LOG_CORE=INFO
export TF_LOG_PROVIDER=TRACE
export TF_LOG_PATH=./provider-trace.log
terraform apply -refresh-only -no-color認証系エラー: コアは成功でもプロバイダのリクエストが拒否されるケースでは、プロバイダ側のDEBUG/TRACEに資格情報の検出、エンドポイント、スコープなどの手がかりが出ます。プロファイルや環境変数の解決順も併せて確認します。
差分が不安定: Data Sourceの読み込み順や、外部変更による漂流を疑い、refresh-onlyやplanの再実行で安定性を比較します。プロバイダの正規化ロジックが属性を丸めていないかも要確認です。
安定性比較の最小手順(Bash)
export TF_LOG=DEBUG
export TF_LOG_PATH=./stability-compare.log
terraform plan -no-color
terraform apply -refresh-only -no-color
terraform plan -no-color
# 3ステップの差を比較して不安定箇所を特定Associate/Pro試験では、TF_LOG/TF_LOG_CORE/TF_LOG_PROVIDER/TF_LOG_PATHの役割、ログレベルの意味、標準エラー出力である点、-no-colorとの併用などが頻出です。どれをいつ使うかを言語化できるようにしましょう。
Terraform Cloud/Enterpriseのリモート実行では、TF_LOGはローカルCLIの挙動にしか効きません。実行本体はリモート側のランログを参照します。CIではジョブ単位のファイル出力と保持期間、秘匿情報のマスキング手順を標準化します。
CIでの安全な取得(例: GitHub Actions ステップ抜粋)
- name: Terraform Plan (debug log)
env:
TF_LOG: DEBUG
TF_LOG_PATH: terraform-${{ github.run_id }}.log
run: |
terraform init -input=false
terraform plan -no-color -input=false
# アーティファクトに保存し、機密文字列はマスクポリシで保護Associate / Pro
問題 1
ある不具合の切り分けで、Terraformの差分計算は静かに保ちつつ、プロバイダ・プラグインのみ詳細に追いたい。ログはファイルに保存したい。最も適切な設定はどれか?
正解: A
プロバイダのみ詳細化しコアは抑える要件なので、TF_LOG_PROVIDER=DEBUGとTF_LOG_CORE=INFOが合致。TF_LOG_PATHでファイル保存も満たす。Bはコアも冗長化する。Cは全体TRACEでノイズ過多。Dは詳細化の要件を満たさない。
TF_LOGを設定したのに何も出ない、または少ないのはなぜ?
標準エラーに出ている可能性があります。シェルのリダイレクトやログ収集側の設定を確認してください。さらにノイズを抑えている場合(TF_LOG_COREやTF_LOG_PROVIDERで低レベル指定)も見直します。
ログに機密情報は含まれますか?
Terraformは一部をマスクしますが、プロバイダのデバッグ出力にはエンドポイントや識別子等の断片が含まれることがあります。必ず組織のポリシーに従い、共有前に秘匿化・削除してください。
Terraform Cloudのリモート実行でもTF_LOGで詳細ログを取れますか?
TF_LOGはローカルCLIの範囲に作用します。リモート実行の詳細はTerraform Cloud/Enterpriseのランログを参照してください。必要に応じて、ローカル側の計画送信や設定解決過程のログはTF_LOGで補助的に取得できます。
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を用いた既存リソース参照の基本、選択基準、評価順序、...