🧌

terraform planの裏で何が起きているのか

2024/08/29に公開

terraform planとは

Terraform開発者にとって、terraform planコマンドは、欠かせない日常ツールと言えます。

このコマンドは、AWSやAzure、GCPなどのクラウドサービスに変更を反映させる前に、どのような変更が行われるのかを事前に確認するために使用されます。

そんなplanコマンドですが、裏でどのように動いているのか気になったことはないでしょうか?
今回はその処理の流れについて大まかに解説していこうと思います。

terraform planの処理の流れ

terraform planを実行したとすると以下の手順で処理します。

  1. 実際のインフラストラクチャtfstateの差分検知(ドリフト検知)
  2. 実際のインフラストラクチャterraformコードの差分検知
  3. 差分をplan結果として表示

順を追って解説します。

実際のインフラストラクチャとtfstateファイルの差分検知(ドリフト検知)

Terraformのplanを実行すると、まずは実際のインフラストラクチャtfstateを比較します。ここでの比較では、「Terraform外のGUIやCLIを通じてリソースが更新されていないか?」を確認しています。
この確認プロセスはドリフト検知と呼ばれます。

通常、tfstate実際のインフラストラクチャの間に差分はありませんが、Terraform以外の方法(例えばGUIやCLI)でリソースが更新された場合、これらの状態が一致しなくなることがあります。そのため、ドリフト検知によってこれらの差分を確認することができます。

実際のインフラストラクチャとTerraformコードの差分検知

ドリフト検知を行った後、その結果を考慮して、実際のインフラストラクチャTerraformコードを比較します。

このステップは、多くの方がterraform planに対して抱くイメージそのものです。ここでは、実際に反映されているインフラストラクチャTerraformコードに記述された最新のインフラストラクチャ差分を求めます。

差分をplan結果として表示

最後に、これらの差分がterraform planの結果として表示されます。これにより、開発者はどのリソースが追加、変更、または削除されるかを事前に確認し、適切な対応を取ることができるようになるのです。

参考

https://developer.hashicorp.com/terraform/cli/run
https://developer.hashicorp.com/terraform/cli/commands/plan
https://blog.serverworks.co.jp/terraform-tfstate-plan-apply
https://developer.hashicorp.com/terraform/language/state
https://developer.hashicorp.com/terraform/language/state/purpose

ドリフト検知についてはこちらを参考にしました

The terraform plan command creates an execution plan, which lets you preview the changes that Terraform plans to make to your infrastructure. By default, when Terraform creates a plan it:
Reads the current state of any already-existing remote objects to make sure that the Terraform state is up-to-date.
Compares the current configuration to the prior state and noting any differences.
Proposes a set of change actions that should, if applied, make the remote objects match the configuration.
Hands-on: Try the Terraform: Get Started tutorials. For more in-depth details on the plan command, check out the Create a Terraform Plan tutorial.
引用元リンク https://developer.hashicorp.com/terraform/cli/commands/plan

実際の環境とTerraformコードの差分についてはこちらを参考にしました

Planning
The terraform plan command evaluates a Terraform configuration to determine the desired state of all the resources it declares, then compares that desired state to the real infrastructure objects being managed with the current working directory and workspace. It uses state data to determine which real objects correspond to which declared resources, and checks the current state of each resource using the relevant infrastructure provider's API.
Once it has determined the difference between the current state and the desired state, terraform plan presents a description of the changes necessary to achieve the desired state. It does not perform any actual changes to real world infrastructure objects; it only presents a plan for making changes.
Plans are usually run to validate configuration changes and confirm that the resulting actions are as expected. However, terraform plan can also save its plan as a runnable artifact, which terraform apply can use to carry out those exact changes.
For details, see the terraform plan command.
引用元リンク https://developer.hashicorp.com/terraform/cli/run

Discussion