Terraform は「構成(HCL)」「状態(state)」「実インフラ(remote)」の差分から計画を導きます。ignore_changes はこの差分評価を一部抑制し、外部変更を受け入れるための安全弁です。
ただし乱用はドリフトの見落としを招きます。本稿では公式の挙動に沿って、使いどころ/使わないほうがよい場面、代替手段との比較、試験での落とし穴を短く実用的にまとめます。
lifecycle.ignore_changes は、指定した属性に関する差分を計画から除外します。対象属性が外部で変更されても、Terraform はそれを元に戻そうとせず、次回の refresh で状態だけは最新の実インフラ値へ更新します。
重要な前提は作成時と作成後で挙動が異なることです。初回作成時は設定値(もしくはプロバイダー既定値)が使われ、ignore_changes は適用後の更新段階から効き始めます。以降、設定ファイル側でその属性を変更しても、計画は発生しません。
置換(force new)が必要な別の変更が発生した場合は、リソースが再作成され、その際は ignore_changes の対象でも構成ファイル上の値(あるいは既定値)が新しいリソースに適用されます。
最小例:特定属性の差分を抑制する
resource "aws_instance" "web" {
ami = var.ami
instance_type = var.instance_type
tags = {
Name = "web"
Owner = var.owner
}
lifecycle {
ignore_changes = [tags] # 外部システムがタグを追記しても計画に出さない
}
}Terraform の計画は「構成 → 状態 ←→ 実インフラ」を同期させる過程で生まれます。ignore_changes は、対象属性の差分が見えても“計画に載せない”フィルターとして作用します。以下の流れを押さえましょう。
1) 初回 apply では設定値で作成。2) 運用中に外部で対象属性が変更される。3) 次回 plan 時に refresh で状態は外部値へ更新されるが、対象属性に関する差分は計画に現れない。4) 別属性の変更で置換がかかった場合、新規作成時は設定値(または既定値)が用いられる。
差分評価における ignore_changes の位置付け
[Configuration]
|
v
diff calc ----> [Filter: ignore_changes on attributes]
| |
| v
[Current State] <---- refresh ---- [Remote]
|
v
[Plan] (ignored attributes: no-op)
挙動の確認:plan は静か、state は変わる
# 外部で tags に変更があっても
terraform plan
# => No changes. (ignore_changes 対象のため計画なし)
# 状態は refresh で外部値へ更新される
terraform plan -refresh-only
terraform apply -refresh-only # 状態のみ更新、リソース変更なしignore_changes は“共存”が必要な箇所に限定して使います。タグ/ラベルの自動付与、外部コントローラが触るフィールド、プロバイダーが都度計算する値などが典型です。一方、セキュリティやネットワーク制御など、Terraform による一貫管理が求められる領域での使用は避けるべきです。
試験では、どの属性が“外部で上書きされうる”か、また“完全管理すべきか”の見極めが問われます。
部分的に管理したい map の例(タグ/ラベル)
resource "google_compute_instance" "app" {
name = "app-1"
machine_type = "e2-medium"
# ... 他の必須属性 ...
labels = {
owner = var.owner
role = "app"
}
lifecycle {
ignore_changes = [labels] # 外部の自動ラベリングと競合しない
}
}ドリフトを“受け入れる”“検知だけする”“是正する” のいずれを狙うかで手段は変わります。試験では目的と作用範囲の違いを問われます。以下の表で使い分けを整理します。
| 手法 | 目的 | 適用範囲 | ドリフト検知 |
|---|---|---|---|
| lifecycle.ignore_changes | 差分の抑制(受け入れ) | 属性単位(リソース内) | 表面化しにくい(plan に出ない) |
| plan/apply -refresh-only | 状態の同期のみ | ワークスペース全体/対象リソース | しない(差分は是正対象外) |
| terraform import | 既存資産を管理下に | リソース単位 | 以後の plan で検知可能に |
| taint / -replace | 強制置換 | リソース単位 | —(明示操作) |
CLI 例:状態だけ更新/置換を強制
# 状態のみ最新化(実インフラ不変)
terraform plan -refresh-only
terraform apply -refresh-only
# 置換を強制(ドリフトを包括的に是正)
terraform plan -replace=aws_instance.web
terraform apply -replace=aws_instance.webignore_changes は“局所化”が肝心です。モジュール内部だけで使い、外部公開する変数でコントロールしないと、呼び出し側でドリフトが不可視になります。また、CI では refresh-only を併用して、状態がどの程度外部で変化しているかを定期的に把握します。
初回作成時にだけ値を流し込み、その後は外部任せにするケースでは、apply 後に外部が上書きするまでの時間差を考慮して、計画の安定性をテストします。
モジュール内の最小化例(AWS: ELB が追記する属性を許容)
resource "aws_lb_target_group" "api" {
name = "api-tg"
port = 80
protocol = "HTTP"
vpc_id = var.vpc_id
# ヘルスチェックの一部は ALB 側で調整されうる
health_check {
path = "/healthz"
}
lifecycle {
ignore_changes = [health_check] # 外部調整を許容(必要最小限に)
}
}ドリフト受け入れは監査の難易度を上げます。誰が・いつ・何を変えたかは Terraform 以外の仕組み(クラウド監査ログ等)で補完してください。試験では、どのレイヤで制御すべきかの“境界線”を問う設問が多いです。
また、ignore_changes は万能ではありません。プロバイダーが内部で常に再計算する読取専用属性については、そもそも計画に出ないため指定不要です。
状態の確認と差分の健全性チェック
# 状態の単体確認
terraform state show aws_instance.web
# 設定変更が他属性に波及していないかを確認
terraform plan -detailed-exitcode
# exit code 0: 変更なし / 2: 変更あり(ignore_changes 以外の差分に注意)Associate / Pro
問題 1
あなたの組織では、クラウド側のポリシーエンジンが全リソースに共通タグを自動付与します。Terraform で一部リソースの tags を管理していますが、外部で追加されたタグを消さずに共存したい。さらに、Terraform の設定側で tags の値を将来変更しても、その変更は適用しない方針です。最も適切な対応はどれですか?
正解: A
外部で追加・変更されるタグを計画から除外し、設定側の将来変更も適用しない要件には lifecycle.ignore_changes = [tags] が最適です。refresh-only は状態更新のみで差分抑制にはならず、data ソース化はリソース管理を放棄してしまいます。taint は置換を強制するため要件と逆方向です。
ignore_changes は初回作成時にも効きますか?
いいえ。初回作成では構成の値(またはプロバイダー既定値)が使われます。ignore_changes は適用後の更新段階から差分を抑制します。
モジュール呼び出し側から ignore_changes を指定できますか?
できません。lifecycle はリソースブロック内でのみ有効です。モジュールとして隠蔽する場合は、モジュール内部のリソースに lifecycle を記述してください。
ignore_changes で無視した属性のドリフトはどうやって把握しますか?
plan には出ないため、terraform plan -refresh-only で状態の差分を可視化したり、クラウドの監査ログやポリシーエンジンのレポートと組み合わせて検知します。監査要件が強い場合は、無視の範囲を最小化してください。
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を用いた既存リソース参照の基本、選択基準、評価順序、...