Terraform importを使って既存のAzureリソース情報を取り込み
Terraformで作成したリソースの状態は、Terraform内で独自に管理されています。
Terraformは独自に構成管理ファイル (terraform.tfstate) を保持します。
Azureからリソース情報を直接取得しているわけではありません。
そのため、Azure Portalなど、Terraform以外の方法で新規に作成されたリソースは、Terraformで認識されません。
Terraformを使ってリソースの作成を試みると、同じリソース名などの理由でエラーが発生する場合があります。
では、Terraform以外で作成したAzureリソースをTerraformで管理したい場合、
どうすればよいでしょうか?この場合は、terraform import を使用してAzureのリソース情報を取り込むことで、Terraformで管理できるようになります。
今回は、Azureリソース情報を例に、terraform importを使って既存のリソース情報を取得する手順を確認します。
また、terraform.tfstateの内容も併せて確認しています。
Terraformはリソースの構成情報をterraform.tfstateで管理している
Terraform独自でリソースの構成情報を管理している
TerraformはAzureなどのパブリッククラウドからリソース情報を直接取得しているわけではありません。
Terraformは、terraform.tfstate というファイルを使用して、Terraform自身でリソースの構成を管理しています。
terraform apply コマンドなどを使用してリソースを変更した場合、この tfstate ファイルが作成または更新されます。
Terraformは、この tfstate ファイルを基にAzureのリソース状態を判断します。
※terraform.tfstateはデフォルトのファイル名です。
terraform importを使ってTerraform以外で作成したリソースの情報を認識させる
tterraform importを使用することで、Terraformで管理されていない既存のAzureリソースをTerraformに認識させることができます。
既存のAzureのリソース情報を、terraform importを使ってtfstateファイルに追加することができます。
Azure Portalなどで作成したAzureリソースなども、Terraformで管理できるようになります。
terraform apply -refresh-onlyを使ってリソースの設定変更内容を反映する
TerraformでデプロイしたリソースをTerraform以外の方法で変更した場合も、tfstate ファイルと実際のリソース状態に差異が生じます。
この差異を tfstate ファイルに反映させるには、terraform apply -refresh-only を使用します。
terraform apply -refresh-onlyを使ったtfstateファイルの更新方法については、こちらで確認しています。
既存リソース情報をterraform importを使ってterraform.tfstateに追加
既存のAzureリソースを terraform import を使って取り込み、その結果として terraform.tfstate の内容がどのように変化するかを確認します。
作成済みのリソースと同じ名前で、リソースを作成して確認します。
-
- terraform import コマンドを実行せずに、同じ名前のリソースグループをTerraformで作成
- リソースの作成が、エラーになることを確認
- terraform importを実行
- terraform planで同じ名前のリソースグループの作成した場合にエラーにならないことを確認
- terraform import コマンドを実行せずに、同じ名前のリソースグループをTerraformで作成
確認用のリソースグループ
確認するための、テンプレートファイルを作成します。
test-rgというリソースグループを例に確認します。
事前に作成したリソースグループ | |
事前にリソースグループを作成しています。 | ![]() |
同じ名前のリソースグループを、Terraformを使って作成します。
main.tf | ||
同じリソースグループ名で作成します。
|
|
既存のリソースと同じ名前のリソースをTerraform使って作成
すでに存在している同じ名前のリソースグループを、Terraform使って作成します。
terraform plan の段階ではエラーは発生しません。
tfstateファイルにそのリソースの情報が登録されておらず、新規リソースと判断されるためです。
terraform applyでリソースグループをデプロイ | ||
terraform initを実行します。
|
||
terraform applyを実行します。
|
terraform importを実行
terraform import を実行します。
terraform import はリソースIDを指定して実行します。
terraform import を実行するためには、リソースブロックを定義したテンプレートファイル(.tf)を事前に準備しておく必要があります。
今回の場合、resource “azurerm_resource_group" “demo" {}と定義されたリソースブロックを準備しています。
terraform import後のterraform.tfstateを確認
エディタで terraform.tfstate を確認します。
terraform.tfstate は、Terraformのコマンドを実行したディレクトリに生成されます。
terraform.tfstateを確認 | |
terraform.tfstate をエディタで確認します。 |
terraform showを使ってterraform.tfstateの内容を確認できる
terraform.tfstateの内容はterraform showを使って確認できます。
terraform showを使って確認 | ||
|
注意点
terraform import コマンドを実行する際には、いくつかの注意点があります。
まず、.tf ファイルにリソースの定義を自分で作成する必要があります。
-
- リソースブロック(.tf ファイル)は事前に準備しておく必要がある
- terraform import は、.tf ファイルを更新したり、新たに生成したりすることはない
例えば、terraform import azurerm_resource_group.demo を実行する場合、resource “azurerm_resource_group" “demo" {}のように定義されたリソースブロックを含む .tf ファイルを用意しておく必要があります:
terraform import は、terraform.tfstate ファイルのみを更新します。
そのため、リソースを定義した .tf ファイルは自分で作成する必要があります。
※今回は、事前にリソースグループを定義した .tf ファイルを使用しているため、エラーは発生していません。
—広告—
最後に
Azure Portalなどで作成したリソースも、terraform import を使うことでTerraformで管理できるようになることが分かりました。
既存のシステムもTerraformで管理できるようになるため、非常に便利だと思いました。
引き続き、いろいろなことを試してみたいと思います。
その他のTerraform関連の記事は、こちらで紹介しています。