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

Azure,Others,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以外でデプロイしたAzureリソースを認識させる場合はterraform import

Terraformに管理されていない既存AzureリソースをTerraformに認識させる為にはterraform importを使います。

import(HashiCorp)

terraform importコマンドを使うと、Azureのリソース情報をtfstateファイルに追加する事が出来ます。
Terraform利用前にAzure Portal等でデプロイしたAzureリソース等をTerraformで扱えるようにする事が出来ます。

Azureリソースの設定変更を反映させる場合はterraform apply -refresh-only

新規のリソースではなく、TerraformでデプロイしたリソースをTerraform以外で変更した場合も、tfstateファイルと実際のリソース状態に差異が生まれます。
この差異をtfstateファイルに反映させる場合はterraform apply -refresh-onlyを使います。
terraform importは新規リソースの場合で既存リソースには使えません。

terraform apply -refresh-onlyを使ったtfstateファイルの更新はこちらでやっていますので、併せて見て頂けると大変有難いです。

terraform importを使って既存リソース情報をterraform.tfstateに追加

terraform importを使って既存Azureリソースを取り込み、terraform.tfstate内容の変化を確認します。

      • terraform importコマンドを実行せずに同じ名前のリソースグループをTerraformでデプロイ
        • エラーになる事を確認します。
      • terraform importコマンドを実行
      • terraform planで同じ名前のリソースグループのデプロイ確認

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

terraform importの確認なので一番シンプルな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 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 テンプレートのリソースタイプとリソース名、(“azurerm_resource_group" “demo"部分) リソースID(Azure上のリソースID)”になります。

【コマンド】
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 azurerm_resource_group.demoの場合にはresource “azurerm_resource_group" “demo" {}とリソースブロックを定義した.tfファイルを準備しておく必要がある。
    • リソースブロック(.tfファイル)は更新されない。新規に.tfファイルが生成される事も無い。
      • terraform.tfstateの更新のみ。
      • リソースを規定した.tfファイルは作成する必要があります。

※今回事前にリソースグループを定義した.tfファイルを利用している為エラーにはなりません。

最後に

Azure Portal等で作成したリソースもterraform importを使う事でTerraformで管理できるようになることが分かりました。
既存のシステムもTerraformで管理できるため非常に便利かと思います。

terraform importでは構成ファイルは生成されませんでしたが、Azure Terrafyを使うと同時に構成ファイルも生成されます。
Azure Terrafyを使った既存AzureリソースのTerraformインポートはこちらでやっています。
併せて見て頂けると大変有難いです。

Terraform関連の記事はこちらになります。
色々試していますので併せて見て頂けると大変有難いです。

Terraformの記事一覧

スポンサーリンク