本稿は、Terraform のドリフト検出を「定期的な plan 実行」で仕組み化するための実務指針です。変更を加えずに差分だけを検出し、失敗基準と通知を自動化することで、予期せぬ本番変更を防ぎます。
HashiCorp 公式ドキュメントで安定運用されている機能(plan のリフレッシュ段階、-detailed-exitcode、-refresh-only、リモートバックエンドのロック、Terraform Cloud のワークスペース実行・通知)を前提に、資格対策でも狙われやすい論点を含めて整理します。
ドリフトとは、Terraform のコードと state が意図する構成と、実インフラ(クラウド API 上の実体)が一致しない状態です。代表例は、手作業変更、他ツールによる更新、自動スケーリングやローテーションの副作用です。
定期的な plan 実行の目的は、インフラを変更せずに差分の有無を確認し、閾値(例: 差分検知=パイプライン失敗)で通知することです。日次・時間単位のチェックにより、予兆段階で対処できます。
terraform plan は、事前にリフレッシュ段階で実インフラの状態を読み取り、state を最新化してから差分を評価します。これにより、手作業変更などの外部更新を把握できます。
-detailed-exitcode は、差分の有無を終了コードで返すための必須フラグです。パイプラインでの分岐(0=差分なし、2=差分あり)に使えます。-refresh-only は、実インフラに変更を加えず、state の更新提案だけを出す専用モードで、変更を行わない“ドリフト検出”に適しています。
最小構成は、スケジューラ(例: GitHub Actions の schedule、Jenkins の cron)で定期的に terraform plan -refresh-only -detailed-exitcode を実行し、終了コード 2 を検出したら通知・チケット化する流れです。実行環境には読み取り権限の資格情報(必要に応じて読み取り+記録の最小権限)を付与します。
バックエンドはリモート(例: Terraform Cloud/Enterprise、S3 + DynamoDB ロック)を使用し、ロックと一貫性を担保します。複数ワークスペースがある場合は並列度を調整し、API レート制限やコストを抑えます。
| 方式 | 検出対象 | 副作用(インフラ変更) | 通知・連携 |
|---|---|---|---|
| CLI: plan -refresh-only -detailed-exitcode | state と実体の差分(外部変更) | なし(state 更新提案のみ) | CI の終了コードで失敗→Slack/Issue 連携 |
| CLI: 通常の plan(-detailed-exitcode のみ) | コードと実体の差分(適用すべき変更) | なし(提案のみ) | 差分ありを検知しレビューへ |
| Terraform Cloud のドリフト検出/スケジュール実行 | ワークスペース単位の差分検出 | なし(検出専用の評価実行) | 通知チャネルや UI で可視化(利用条件は要確認) |
定期 plan によるドリフト検出(概念図)
GitHub Actions(schedule)での -refresh-only ドリフト検出例
name: Drift Detection (Nightly)
on:
schedule:
- cron: '0 2 * * *' # UTC 02:00
workflow_dispatch:
jobs:
plan-refresh-only:
runs-on: ubuntu-latest
permissions:
id-token: write # OIDC でクラウドにフェデレーション
contents: read
steps:
- uses: actions/checkout@v4
- name: Set up Terraform
uses: hashicorp/setup-terraform@v3
with:
terraform_version: 1.x
- name: Cloud credentials (example)
run: |
echo "短期クレデンシャルをここで取得(例: AWS STS / GCP Workload Identity)"
- name: Terraform init (remote backend)
run: terraform init -input=false
- name: Drift detection (refresh-only)
id: plan
run: |
set -e
terraform plan -refresh-only -detailed-exitcode -no-color || RC=$?
if [ "${RC}" = "2" ]; then
echo "DRIFT=true" >> $GITHUB_OUTPUT
exit 2
elif [ -n "${RC}" ] && [ "${RC}" != "0" ]; then
echo "Terraform error (RC=${RC})" >&2
exit ${RC}
fi
- name: Notify on drift
if: failure() && steps.plan.outputs.DRIFT == 'true'
run: |
echo "Drift detected. Post to Slack / create issue here."Terraform Cloud/Enterprise のワークスペース実行を使うと、リモート状態管理・ロック・権限分離・通知チャネル連携を一体で扱えます。ドリフト検出(リフレッシュ起点の評価)やスケジュール/ポリシー連携を用いると、検出と可視化をプラットフォーム側に寄せられます(利用可否や詳細は公式ドキュメントの最新情報を参照してください)。
設計のポイントは、検出用実行と変更適用用実行を分離すること、通知チャネル(メール、Webhook 等)でのアラート運用を明確にすること、必要に応じてポリシー(Sentinel など)で“手動変更を検出したら適用をブロック”といったガードレールを敷くことです。
資格情報は最小権限・短期化を徹底します。検出だけなら読み取り中心ですが、バックエンド種別によっては state 書き込みやロック取得が必要になるため、バックエンド要件に合わせた権限設計が必要です。
API レート制限と実行コスト対策として、並列度(-parallelism)、ワークスペースのバッチ分割、動的に変更頻度の高いスタックの優先度制御を行います。ノイズ低減には lifecycle の ignore_changes を適切に使い、可変要素(タイムスタンプやランダム値)を計画に載せない工夫が有効です。
plan の事前リフレッシュ、-detailed-exitcode の意味、-refresh-only と通常 plan の使い分けは基本問題として出題されやすいです。バックエンドのロック、ワークスペース設計、Sentinel/ポリシー連携、サービスアカウントの最小権限なども頻出です。
シナリオ問題では「定期的に差分だけを検出し、インフラは絶対に変更しない」「差分時は通知して手動レビューへ」という要件が提示されます。この場合は plan -refresh-only -detailed-exitcode を選び、終了コード 2 を通知トリガーにする、が模範解です。
Pro
問題 1
本番環境で、リソースを一切変更せずに“外部変更によるドリフト”だけを毎晩検出し、差分があればパイプラインを失敗させて通知したい。最も適切な CLI 実行はどれか。
正解: A
ドリフト検出でインフラを変更しない要件には -refresh-only が適合します。-detailed-exitcode により差分時は終了コード 2 となり、パイプラインで失敗扱いにできます。-refresh=false は外部変更を取り込まず誤検知の原因となり不適切。apply は変更を伴う可能性があるため要件違反。state pull の手作業比較は自動化と整合しません。
refresh-only で差分が出た。すぐに apply すべき?
まずは原因の特定が先です。手作業変更が正当であれば、コードへ反映(もしくは ignore_changes を再検討)し、その後に通常の plan/apply で整合を取ります。state を現実に合わせるだけなら apply -refresh-only で state のみ更新できますが、運用ルールに従ってレビューと承認を挟んでください。
データソース(data ブロック)の変化はドリフトとして検出される?
data は管理対象リソースではなく、毎回の評価時に読み直される性質です。通常は“管理リソースの差分”がドリフト検出の主対象であり、data の値変化そのものはドリフト扱いではありません。data の変化が管理リソースに影響する場合は、その差分として plan に現れます。
大規模環境でドリフト検出のノイズを減らすには?
ignore_changes の適用、変更が多いリソースの分離、スケジュールの分割(重要スタックは高頻度、それ以外は低頻度)、並列度やリトライの調整、差分サマリのみ通知(詳細はログへ)などを組み合わせます。恒常的に差分が出る箇所は、設計・権限・自動化の見直しが有効です。
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を用いた既存リソース参照の基本、選択基準、評価順序、...