Terraform importを使って既存のAzureリソース情報を取り込み

Azure,Others,Terraform

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を使用します。

import(HashiCorp)

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使って確認

Azureリソースグループのテンプレートファイル

最もシンプルなリソースグループを使用して確認します。
すべての定義はmain.tfで行っています。
eastus2リージョンにtest-rgというリソースグループを作成します。

main.tf

1つのファイルでAzure リソースグループをデプロイするようにしています。

 

 

terraform {
  required_version = “>= 0.12"
  required_providers {
    azurerm = {
      source  = “hashicorp/azurerm"
      version = “=2.46.0"
    }
  }
}

provider “azurerm" {
  features {}
}

resource “azurerm_resource_group" “demo" {
  name     = “test-rg"
  location = “eastus2"
}

terraform import実行前に同じ名前のリソースグループをTerraformでデプロイ

事前にAzure Portalを使って、リソースグループ(test-rg)をデプロイしています。

事前に作成したリソースグループ
Azure Portal上で作成されたリソースグループを確認します。

Terraformを使って、同じ名前のリソースグループをデプロイします。
Planの段階ではエラーにはなりません。
これは、tfstateファイルにそのリソースの情報がないためです。

terraform applyでリソースグループをデプロイ

terraform initを実行します。

PS C:\terraform> terraform init

Initializing the backend…

Initializing provider plugins…
– Using previously-installed hashicorp/azurerm v2.46.0

Terraform has been successfully initialized!

<以下略>

terraform applyを実行します。
Azure上に同じリソースが存在するために、already existsエラーが発生することを確認できました。

PS C:\terraform> terraform apply

+ create

Terraform will perform the following actions:

# azurerm_resource_group.rg-01 will be created
+ resource “azurerm_resource_group" “demo" {
+ id = (known after apply)
+ location = “eastus2"
+ name = “test-rg"
}

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes’ will be accepted to approve.

Enter a value: yes

azurerm_resource_group.demo: Creating…
?
│ Error: A resource with the ID
“/subscriptions/サブスクリプションID/resourceGroups/test-rg"

already exists – to be managed via Terraform this resource needs to be imported
into the State.Please see the resource documentation for
“azurerm_resource_group" for more information.


│ with azurerm_resource_group.demo,
│ on rg_01.tf line 1, in resource “azurerm_resource_group" “demo":
│ 1: resource “azurerm_resource_group" “demo" {

terraform importを実行

terraform importコマンドを実行します。
terraform importは、リソースIDを指定して実行します。

terraform importを実行するためには、リソースブロックを定義したテンプレートファイル(.tf)を事前に準備しておく必要があります。
今回の場合、resource “azurerm_resource_group" “demo" {}と定義されたリソースブロックを準備しています。

terraform import
リソースグループのプロパティでリソースIDを確認する事が出来ます。

terraform importを実行します。

【terraform importコマンド】
terraform import リソースタイプ.リソース名 リソースID

コマンド実行結果を確認します。
Import successful!と表示されており、importが成功した事が確認できます。

PS C:\terraform> terraform import azurerm_resource_group.demo /subscriptions/サブスクリプションID/resourceGroups/test-rg

azurerm_resource_group.demo: Importing from ID “/subscriptions/サブスクリプションID/resourceGroups/test-rg"…azurerm_resource_group.demo: Import prepared!
Prepared azurerm_resource_group for import
azurerm_resource_group.demo: Refreshing state… [id=/subscriptions/サブスクリプションID/resourceGroups/test-rg]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

terraform.tfstateを確認

テキストエディタでterraform.tfstateを確認します。
terraform.tfstateは、Terraformコマンド実行したディレクトリに生成されます。

terraform.tfstate

terraform.tfstateをエディタで確認します。
リソースグループの状態が記録されている事を確認できます。

terraform.tfstateの中身はterraform showで確認できる

terraform showを使うとterraform.tfstateの内容を確認できます。

terraform show

PS C:\terraform> terraform show
# azurerm_resource_group.demo:
resource “azurerm_resource_group" “demo" {
id = “/subscriptions/サブスクリプションID/resourceGroups/test-rg"
location = “eastus2"
name = “test-rg"

注意点

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関連の記事はこちらになります。
併せて見て頂けると大変有難いです。

Terraformの記事一覧

スポンサーリンク