メインコンテンツまでスキップ

Terraformのignore_changesの使い方

· 約7分

ignore_changes とは?

ignore_changes は、特定の属性の変更をTerraformが気にしないようにする設定です。これを使うことで、ある属性を手動で変更してもTerraformはそれを無視します。

ignore_changes がない場合とある場合の挙動の違い

ignore_changes がある場合とない場合の挙動の違いを説明します。

ignore_changes がない場合の挙動:

  1. Terraformを実行してリソースを作成
    例えば、AWSのインスタンスを作成するコードを実行します。

    resource "aws_instance" "example" {
    ami = "ami-12345678"
    instance_type = "t2.micro"

    tags = {
    Name = "MyInstance"
    }
    }
  2. 手動でリソースの属性を変更
    この後、AWSの管理コンソールからインスタンスのNameタグを"MyNewInstance"に変更します。

  3. 再度Terraformを実行
    もう一度Terraformのplanapplyを実行すると、Nameタグが"MyInstance"と"MyNewInstance"の間に差異があると検知します。Terraformはこの差異を修正しようとします。すなわち、Nameタグを再び"MyInstance"に戻そうとします。


ignore_changes がある場合の挙動:

  1. Terraformを実行してリソースを作成
    今度はignore_changes を使用して同じリソースを作成します。

    resource "aws_instance" "example" {
    ami = "ami-12345678"
    instance_type = "t2.micro"

    tags = {
    Name = "MyInstance"
    }

    lifecycle {
    ignore_changes = [tags["Name"]]
    }
    }
  2. 手動でリソースの属性を変更
    同様に、AWSの管理コンソールからインスタンスのNameタグを"MyNewInstance"に変更します。

  3. 再度Terraformを実行
    もう一度Terraformのplanapplyを実行しても、今回はNameタグについての変更は無視されます。したがって、TerraformはNameタグの"MyNewInstance"をそのままにして、変更しようとしません。

補足:ignore_changes がある場合でも、stateファイルにはリアルタイムのリソースの状態が保存される

Terraformのignore_changesが設定されている場合でも、Terraformはリアルタイムのリソースの状態をterraform.tfstate(stateファイル)に反映します。ignore_changesplanapplyの際の挙動を制御するものであり、実際のリソースの状態の記録には影響しません。

具体的な動作を詳しく説明します:

  1. ignore_changesが設定されたリソースを作成: 最初に、ignore_changesが設定されたリソースをterraform applyで作成します。この操作後、stateファイルにはそのリソースの最初の状態が保存されます。

  2. リソースを手動で変更: 次に、外部の手段(例えば、クラウドのコンソール)でリソースを手動で変更します。

  3. Terraformのrefreshまたはapplyを実行: この操作を行うと、Terraformはクラウドプロバイダから最新のリソースの状態を取得し、stateファイルを更新します。この時点で、stateファイルには手動で変更されたリソースの状態が反映されます。

  4. 変更の検知: terraform planを実行すると、通常はTerraformがコードとstateファイルの差異を報告します。しかし、ignore_changesが設定されている属性については、この差異は報告されません。それにも関わらず、stateファイル自体には実際のリソースの状態が正確に記録されています。

ignore_changesの挙動を以下の図で説明します。

ignore_changesが設定されていない場合

ignore_changesが設定されている場合

簡単にまとめると、

  • ignore_changesは、Terraformがplanapplyの際に特定の属性の変更を無視するようにするものです。
  • しかし、stateファイルには常にリアルタイムのリソースの状態が保存されます。
  • そのため、手動で変更した後、Terraformの操作でstateファイルを更新すると、その手動変更がstateファイルに反映されますが、その変更はplanapplyで無視されます。

参考:https://dev.classmethod.jp/articles/note-about-terraform-ignore-changes/

まとめ

  • ignore_changes がない場合:Terraformは手動での変更を検知し、それを修正しようとします。
  • ignore_changes がある場合:指定した属性についての変更はTerraformによって無視されます。したがって、手動での変更が維持されます。

この機能は、特定の属性の手動変更を許容したい場合や、外部のプロセスによって頻繁に変更される属性をTerraformの管理外に置きたい場合に有用です。