terraform apply -refresh-onlyで変更内容をterraform.tfstateに反映

Azure,Others,Terraform

terraform apply -refresh-onlyを使ったterraform.tfstateの更新手順です。

Terraformで管理するリソースの構成情報は、状態管理ファイル(terraform.tfstate)で管理されます。
Azure Portalなど、Terraform以外の方法でリソースを変更した場合、その変更内容はterraform.tfstateには反映されません。
そのため、実際のAzureリソースの状態とterraform.tfstateで管理される状態との間に差異が発生します。

terraform apply -refresh-onlyを使用すると、最新のAzureリソースの状態をterraform.tfstateに反映させることができます。
今回は、Azure仮想マシンのサイズ変更を例に、terraform apply -refresh-onlyを使ったterraform.tfstateの更新手順について確認します。

スポンサーリンク

Azureのリソース情報をterraform.tfstateに反映させる方法

terraform importとterraform apply -refresh-onlyの違い

既存のAzureリソース情報をTerraformに取り込む方法として、terraform import や terraform apply -refresh-only などがあります。

terraform import は、Terraformでまだ管理されていないAzureリソースをTerraformに新たに認識させる際に使用します。
このコマンドは、対象リソースが terraform.tfstate に存在しない場合に利用します。

Terraform Importについては、こちらで確認しています。

terraform apply -refresh-only は、すでにTerraformで管理されているAzureリソースの状態を更新する場合に使用します。
このコマンドは、すでにTerraformの状態管理ファイル(terraform.tfstate)に存在しているリソースのみを更新します。

Command: apply(Plan Options)(HasgiCorp)

terraform apply -refresh-onlyは状態管理ファイル(terraform.tfstate)だけを更新する

terraform apply -refresh-only を実行すると、terraform.tfstate が更新されます。
しかし、テンプレートファイル(.tf)は更新されません。
そのため、テンプレートファイルを別途修正する必要があります。

まとめ

terraform import と terraform apply -refresh-only の違いについて簡単にまとめると、次のようになります。

コマンド terraform.tfstateにリソースが存在するか terraform.tfstateの更新 テンプレートファイルの作成、更新
terraform import × ×
terraform apply -refresh-only ×

—広告—

terraform apply -refresh-onlyを使ってTerraformの状態管理ファイル(terraform.tfstate)を更新

今回は、Azure Portalを使って仮想マシンのサイズを変更し、その結果を確認します。
仮想マシンのサイズは、Standard_B1msからStandard_B2msに変更しています。
あらかじめ作成した仮想マシンを使用しています。

terraform showでterraform.tfstateに記録されている仮想マシンサイズを確認

terraform showを使って、terraform.tfstateに記録されている仮想マシンのサイズを確認します。

terraform showで仮想マシンサイズを確認
terraform showでterraform.tfstateの情報を確認します。
仮想マシンのサイズが Standard_B1ms となっていることが確認できます。

Azure Portalで仮想マシンのサイズを変更

Azure Portalで、仮想マシンのサイズを Standard_B1msからStandard_B2msに変更します。

仮想マシンのサイズを変更
仮想マシンのリソースメニューでサイズを選択します。
サイズのリストから B2msを選択します。
サイズ変更後に確認すると、Standard_B2msになっていることが確認できます。

terraform apply -refresh-onlyでterraform.tfstateを更新

terraform apply -refresh-onlyを実行して、仮想マシンのサイズ変更をterraform.tfstateに反映します。

terraform apply -refresh-onlyでterraform.tfstateを更新

実際のAzureリソースとterraform.tfstateの差異が、変更内容として表示されます。
Enter a value で yes を選択すると、terraform.tfstate のみが更新されます。

※Terraformの実行結果が “0 changed" になっていることが確認できます。

terraform showでterraform.tfstateの更新確認

再度、terraform showを使って、terraform.tfstateに記録されている仮想マシンのサイズを確認します。

terraform showコマンドで仮想マシンサイズを確認
仮想マシンのサイズを確認します。
Standard_B2msに更新されていることを確認できます。

terraform applyを実行して確認

terraform.tfstateは更新されていますが、テンプレートファイル(.tf)は更新されておらず、差異がある状態になっています。
この状態で terraform applyを実行すると、仮想マシンのサイズを変更しようとします。

terraform applyを実行
テンプレートファイル(.tf)で設定しているサイズ(Standard_B1ms)に変更しようとします。

テンプレートファイル(.tf)修正後に、terraform applyを実行

テンプレートファイル(.tf)の仮想マシンのサイズを直接修正します。変更後に、terraform apply を実行して確認します。

テンプレートファイル(.tf)を更新
テンプレートファイル(.tf)の仮想マシンのサイズをStandard_B2msに変更します。
変更後に、terraform apply を実行すると、テンプレートファイルと terraform.tfstate に差異がないため、0 changed となります。

—広告—

最後に

terraform apply -refresh-only を使用した、Terraformの状態管理ファイル(terraform.tfstate)の更新について確認しました。
Azure Portalなど、Terraform以外の方法で変更したリソース情報も、Terraformに反映できることが分かりました。

引き続き、Terraformについていろいろ試していみたいと思います。

Terraformの記事一覧

スポンサーリンク