ignore_changes
とは?
ignore_changes
は、特定の属性の変更をTerraformが気にしないようにする設定です。これを使うことで、ある属性を手動で変更してもTerraformはそれを無視します。
ignore_changes がない場合とある場合の挙動の違い
ignore_changes
がある場合とない場合の挙動の違いを説明します。
ignore_changes
がない場合の挙動:
-
Terraformを実行してリソースを作成
例えば、AWSのインスタンスを作成するコードを実行します。resource "aws_instance" "example" {
ami = "ami-12345678"
instance_type = "t2.micro"
tags = {
Name = "MyInstance"
}
} -
手動でリソースの属性を変更
この後、AWSの管理コンソールからインスタンスのName
タグを"MyNewInstance"に変更します。 -
再度Terraformを実行
もう一度Terraformのplan
やapply
を実行すると、Name
タグが"MyInstance"と"MyNewInstance"の間に差異があると検知します。Terraformはこの差異を修正しようとします。すなわち、Name
タグを再び"MyInstance"に戻そうとします。
ignore_changes
がある場合の挙動:
-
Terraformを実行してリソースを作成
今度はignore_changes
を使用して同じリソースを作成します。resource "aws_instance" "example" {
ami = "ami-12345678"
instance_type = "t2.micro"
tags = {
Name = "MyInstance"
}
lifecycle {
ignore_changes = [tags["Name"]]
}
} -
手動でリソースの属性を変更
同様に、AWSの管理コンソールからインスタンスのName
タグを"MyNewInstance"に変更します。 -
再度Terraformを実行
もう一度Terraformのplan
やapply
を実行しても、今回はName
タグについての変更は無視されます。したがって、TerraformはName
タグの"MyNewInstance"をそのままにして、変更しようとしません。
補足:ignore_changes がある場合でも、stateファイルにはリアルタイムのリソースの状態が保存される
Terraformのignore_changes
が設定されている場合でも、Terraformはリアルタイムのリソースの状態をterraform.tfstate
(stateファイル)に反映します。ignore_changes
はplan
やapply
の際の挙動を制御するものであり、実際のリソースの状態の記録には影響しません。
具体的な動作を詳しく説明します:
-
ignore_changes
が設定されたリソースを作成: 最初に、ignore_changes
が設定されたリソースをterraform apply
で作成します。この操作後、stateファイルにはそのリソースの最初の状態が保存されます。 -
リソースを手動で変更: 次に、外部の手段(例えば、クラウドのコンソール)でリソースを手動で変更します。
-
Terraformの
refresh
またはapply
を実行: この操作を行うと、Terraformはクラウドプロバイダから最新のリソースの状態を取得し、stateファイルを更新します。この時点で、stateファイルには手動で変更されたリソースの状態が反映されます。 -
変更の検知:
terraform plan
を実行すると、通常はTerraformがコードとstateファイルの差異を報告します。しかし、ignore_changes
が設定されている属性については、この差異は報告されません。それにも関わらず、stateファイル自体には実際のリソースの状態が正確に記録されています。
ignore_changes
の挙動を以下の図で説明します。
ignore_changes
が設定されていない場合
ignore_changes
が設定されている場合
簡単にまとめると、
ignore_changes
は、Terraformがplan
やapply
の際に特定の属性の変更を無視するようにするものです。- しかし、stateファイルには常にリアルタイムのリソースの状態が保存されます。
- そのため、手動で変更した後、Terraformの操作でstateファイルを更新すると、その手動変更がstateファイルに反映されますが、その変更は
plan
やapply
で無視されます。
参考:https://dev.classmethod.jp/articles/note-about-terraform-ignore-changes/
まとめ
ignore_changes
がない場合:Terraformは手動での変更を検知し、それを修正しようとします。ignore_changes
がある場合:指定した属性についての変更はTerraformによって無視されます。したがって、手動での変更が維持されます。
この機能は、特定の属性の手動変更を許容したい場合や、外部のプロセスによって頻繁に変更される属性をTerraformの管理外に置きたい場合に有用です。