Terraform importを使って既存のAzureリソース情報を取り込み
Terraformで作成したリソースの状態は、Terraform内で独自に管理されています。
Terraformは独自に構成管理ファイル(terraform.tfstate)を持ちます。
直接Azureからリソース情報を取得しているわけではありません。
そのため、Azure PortalなどTerraform以外の方法で新規に作成されたリソースは、Terraformでは認識されません。
同じリソース名でデプロイしようとして、エラーが発生することがあります。
Terraform以外で作成したAzureリソースをTerraformで管理したい場合は、どうすればよいでしょうか。
この場合は、terraform importを使用してAzureのリソース情報を取り込むことで、Terraformで管理できるようになります。
今回は、terraform importを使ってAzureリソース情報を取得する方法を試してみました。
terraform.tfstateの確認も併せて行いました。
TerraformはAzureリソース状態をterraform.tfstateで管理している
Terraformはterraform.tfstateファイルで構成情報を管理している
TerraformはAzure側のリソースを直接確認して実行しているわけではありません。
Terraformは自身のterraform.tfstateというファイルでリソースの構成を管理しています。
terraform applyコマンドなどでリソースを変更した場合、このtfstateファイルが作成・更新されます。
Terraformはこのtfstateファイルを基にAzureのリソース状態を判断します。
※terraform.tfstateはデフォルトのファイル名です。
terraform importを使ってTerraform以外で作成したAzureリソースを認識させる
Terraformに管理されていない既存のAzureリソースをTerraformに認識させるためには、terraform importを使用します。
terraform importコマンドを使うことで、Azureのリソース情報をtfstateファイルに追加することができます。
Terraformを利用する前にAzure PortalなどでデプロイしたAzureリソースなども、Terraformで管理できるようになります。
terraform apply -refresh-onlyを使ってAzureリソースの設定変更を反映させる
新規のリソースではなく、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使ってデプロイ
Azureリソースグループのテンプレートファイル
最もシンプルなリソースグループを使用して確認します。
すべての定義はmain.tfで行っています。
eastus2リージョンにtest-rgというリソースグループを作成します。
main.tf | ||
1つのファイルでAzure リソースグループをデプロイするようにしています。
|
|
terraform import実行前に同じ名前のリソースグループをTerraformでデプロイ
事前にAzure Portalを使って、リソースグループ(test-rg)をデプロイしています。
事前に作成したリソースグループ | |
Azure Portal上で作成されたリソースグループを確認します。 |
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.tfstateを確認
テキストエディタでterraform.tfstateを確認します。
terraform.tfstateは、Terraformコマンド実行したディレクトリに生成されます。
terraform.tfstate | |
terraform.tfstateをエディタで確認します。 |
terraform.tfstateの中身はterraform showで確認できる
terraform showを使うとterraform.tfstateの内容を確認できます。
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関連の記事はこちらになります。
併せて見て頂けると大変有難いです。