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

Azure,Others,Terraform

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に認識させることができます。

import(HashiCorp)

既存の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で同じ名前のリソースグループの作成した場合にエラーにならないことを確認

確認用のリソースグループ

確認するための、テンプレートファイルを作成します。
test-rgというリソースグループを例に確認します。

事前に作成したリソースグループ
事前にリソースグループを作成しています。

同じ名前のリソースグループを、Terraformを使って作成します。

main.tf

同じリソースグループ名で作成します。

 

 

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使って作成

すでに存在している同じ名前のリソースグループを、Terraform使って作成します。
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を実行します。
既に同じリソースが存在している場合、"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!" と表示されており、インポートが成功したことが確認できます。

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 import後のterraform.tfstateを確認

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

terraform.tfstateを確認

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

terraform showを使ってterraform.tfstateの内容を確認できる

terraform.tfstateの内容はterraform showを使って確認できます。

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の記事一覧

スポンサーリンク