importブロックを使用して既存AzureリソースをTerraform定義ファイルに取り込む

以前、Terraformを一から作成しAzureリソースを作成する手段や、既存リソースを参照し、Terraformにて追加リソースを作成する手段について書きました。

blog.jbs.co.jp

blog.jbs.co.jp

本記事では、Terraformを使わずに作成した既存Azureリソースを、Terraformで管理できるようにする方法について解説します。

importブロックとは

importブロックとは、既存のリソースをTerraformにインポートし、Terraform管理下に置くことが出来るブロックです。
terraform importコマンドとは異なり、tfファイル上にリソース定義を生成することが可能となります。 developer.hashicorp.com

前提

importブロックはTerraform v1.5.0以降でのみ使用可能なため、v1.5.0以降のバージョンをご準備ください。

Note: Import blocks are only available in Terraform v1.5.0 and later.

developer.hashicorp.com

実行手順

今回は例として、以下リソースをimportする場合の例を記載致します。

  • リソースグループ
  • ストレージアカウント

importリソース

main.tfを作成する

provider "azurerm" {
  features {}
}

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
    }
  }

  # Store Terraform state in Azure Storage
  backend "azurerm" {
    resource_group_name  = "<Resource Group名(状態格納用ストレージアカウントが格納されているResource Group)>"
    storage_account_name = "<Storage Account名>"
    container_name       = "<Blob Container名>"
    # Statment File Name
    key = "import_resource.tfstate"
  }
}

# Resource Group
import{
  id = "/subscriptions/<サブスクリプションID>/resourceGroups/nishiyamas-tf-rg"
  to = azurerm_resource_group.rg
}

# Storage Account
import{
  id = "/subscriptions/<サブスクリプションID>/resourceGroups/nishiyamas-tf-rg/providers/Microsoft.Storage/storageAccounts/<ストレージアカウント名>"
  to = azurerm_storage_account.st
}

Azureにサインインする

今回はAzure CLIにてAzureへサインインを行います。

 az login --tenant "Tenant ID"

初期化を行う

次のコマンドを実行して初期化を行い、provider pluginsを取得します。

terraform init

成功すると「Terraform has been successfully initialized!」と表示されます。

terraform init実行画面

リソースのimportを行う

次のコマンドを実行し、リソースのimportを行います。

terraform plan -generate-config-out="<任意のファイル名>.tf"

今回はファイル名を「import_resource.tf」とします。

問題なくインポートされた場合、末尾に「Plan: 2 to import, 0 to add, 0 to change, 0 to destroy.」と表示されます。

terraform plan -generate-config-out="import_resource.tf"実行画面(1)
terraform plan -generate-config-out="import_resource.tf"実行画面(2)

import_resource.tfが作成されていることを確認する

main.tfと同じディレクトリ上に「import_resource.tf」が作成されていることを確認します。

ファイルの中を確認すると、既存AzureリソースがTerraformに取り込まれていることがわかります。

# __generated__ by Terraform
# Please review these resources and move them into your main configuration files.

# __generated__ by Terraform from "/subscriptions/<サブスクリプションID>/resourceGroups/nishiyamas-tf-rg"
resource "azurerm_resource_group" "rg" {
  location   = "japaneast"
  managed_by = null
  name       = "nishiyamas-tf-rg"
  tags = {
  }
}

# __generated__ by Terraform from "/subscriptions/<サブスクリプションID>/resourceGroups/nishiyamas-tf-rg/providers/Microsoft.Storage/storageAccounts/<ストレージアカウント名>"
resource "azurerm_storage_account" "st" {
  access_tier                       = "Hot"
  account_kind                      = "StorageV2"
  account_replication_type          = "LRS"
  account_tier                      = "Standard"
  allow_nested_items_to_be_public   = false
  allowed_copy_scope                = null
  cross_tenant_replication_enabled  = false
  default_to_oauth_authentication   = false
  edge_zone                         = null
  enable_https_traffic_only         = true
  infrastructure_encryption_enabled = false
  is_hns_enabled                    = false
  large_file_share_enabled          = null
  local_user_enabled                = true
  location                          = "japaneast"
  min_tls_version                   = "TLS1_2"
  name                              = "<ストレージアカウント名>"
  nfsv3_enabled                     = false
  public_network_access_enabled     = true
  queue_encryption_key_type         = "Service"
  resource_group_name               = "nishiyamas-tf-rg"
  sftp_enabled                      = false
  shared_access_key_enabled         = true
  table_encryption_key_type         = "Service"
  tags = {
  }
  blob_properties {
    change_feed_enabled           = true
    change_feed_retention_in_days = 7
    default_service_version       = null
    last_access_time_enabled      = false
    versioning_enabled            = false
    container_delete_retention_policy {
      days = 7
    }
    delete_retention_policy {
      days = 7
    }
  }
  network_rules {
    bypass                     = ["AzureServices"]
    default_action             = "Allow"
    ip_rules                   = []
    virtual_network_subnet_ids = []
  }
  queue_properties {
    hour_metrics {
      enabled               = true
      include_apis          = true
      retention_policy_days = 7
      version               = "1.0"
    }
    logging {
      delete                = true
      read                  = true
      retention_policy_days = 7
      version               = "1.0"
      write                 = true
    }
    minute_metrics {
      enabled               = true
      include_apis          = true
      retention_policy_days = 7
      version               = "1.0"
    }
  }
  share_properties {
    retention_policy {
      days = 7
    }
  }
}

tfstateファイルを更新する

tfstateファイル更新のため、次のコマンドを実行します。

terraform apply

terraform apply実行画面(1)
内容に問題がないことを確認し、「yes」を入力後「Enter」を押下します。
terraform apply実行画面(2)

問題なく完了すると「Apply complete! Resources: 2 imported, 0 added, 0 changed, 0 destroyed.」と表示されます。

terraform apply実行画面(3)
tfstateファイルを確認すると、リソース情報が書き込まれていることが確認できます。

{
  "version": 4,
  "terraform_version": "1.6.5",
  "serial": 2,
  "lineage": "xxx",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "azurerm_resource_group",
      "name": "rg",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "id": "/subscriptions/<サブスクリプションID>/resourceGroups/nishiyamas-tf-rg",
            "location": "japaneast",
            "managed_by": "",
            "name": "nishiyamas-tf-rg",
            "tags": {
            },
            "timeouts": null
          },
          "sensitive_attributes": [],
          "private": "<キー情報>"
        }
      ]
    },
    {
      "mode": "managed",
      "type": "azurerm_storage_account",
      "name": "st",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
        {
          "schema_version": 4,
          "attributes": {
            "access_tier": "Hot",
            "account_kind": "StorageV2",
            "account_replication_type": "LRS",
            "account_tier": "Standard",
            "allow_nested_items_to_be_public": false,
            "allowed_copy_scope": "",
            "azure_files_authentication": [],
            "blob_properties": [
              {
                "change_feed_enabled": true,
                "change_feed_retention_in_days": 7,
                "container_delete_retention_policy": [
                  {
                    "days": 7
                  }
                ],
                "cors_rule": [],
                "default_service_version": "",
                "delete_retention_policy": [
                  {
                    "days": 7
                  }
                ],
                "last_access_time_enabled": false,
                "restore_policy": [],
                "versioning_enabled": false
              }
            ],
            "cross_tenant_replication_enabled": false,
            "custom_domain": [],
            "customer_managed_key": [],
            "default_to_oauth_authentication": false,
            "edge_zone": "",
            "enable_https_traffic_only": true,
            "id": "/subscriptions/<サブスクリプションID>/resourceGroups/nishiyamas-tf-rg/providers/Microsoft.Storage/storageAccounts/<ストレージアカウント名>",
            "identity": [],
            "immutability_policy": [],
            "infrastructure_encryption_enabled": false,
            "is_hns_enabled": false,
            "large_file_share_enabled": null,
            "local_user_enabled": true,
            "location": "japaneast",
            "min_tls_version": "TLS1_2",
            "name": "<ストレージアカウント名>",
            "network_rules": [
              {
                "bypass": [
                  "AzureServices"
                ],
                "default_action": "Allow",
                "ip_rules": [],
                "private_link_access": [],
                "virtual_network_subnet_ids": []
              }
            ],
            "nfsv3_enabled": false,
            "primary_access_key": "<キー情報>",
            "primary_blob_connection_string": "DefaultEndpointsProtocol=https;BlobEndpoint=https://xxx.blob.core.windows.net/;AccountName=<ストレージアカウント名>;AccountKey=<キー情報>",
            "primary_blob_endpoint": "https://xxx.blob.core.windows.net/",
            "primary_blob_host": "xxx.blob.core.windows.net",
            "primary_blob_internet_endpoint": "",
            "primary_blob_internet_host": "",
            "primary_blob_microsoft_endpoint": "",
            "primary_blob_microsoft_host": "",
            "primary_connection_string": "DefaultEndpointsProtocol=https;AccountName=<ストレージアカウント名>;AccountKey=<キー情報>;EndpointSuffix=core.windows.net",
            "primary_dfs_endpoint": "https://xxx.dfs.core.windows.net/",
            "primary_dfs_host": "xxx.dfs.core.windows.net",
            "primary_dfs_internet_endpoint": "",
            "primary_dfs_internet_host": "",
            "primary_dfs_microsoft_endpoint": "",
            "primary_dfs_microsoft_host": "",
            "primary_file_endpoint": "https://xxxt.file.core.windows.net/",
            "primary_file_host": "xxx.file.core.windows.net",
            "primary_file_internet_endpoint": "",
            "primary_file_internet_host": "",
            "primary_file_microsoft_endpoint": "",
            "primary_file_microsoft_host": "",
            "primary_location": "japaneast",
            "primary_queue_endpoint": "https://xxx.queue.core.windows.net/",
            "primary_queue_host": "xxx.queue.core.windows.net",
            "primary_queue_microsoft_endpoint": "",
            "primary_queue_microsoft_host": "",
            "primary_table_endpoint": "https://xxx.table.core.windows.net/",
            "primary_table_host": "xxx.table.core.windows.net",
            "primary_table_microsoft_endpoint": "",
            "primary_table_microsoft_host": "",
            "primary_web_endpoint": "https://xxx.z11.web.core.windows.net/",
            "primary_web_host": "xxx.z11.web.core.windows.net",
            "primary_web_internet_endpoint": "",
            "primary_web_internet_host": "",
            "primary_web_microsoft_endpoint": "",
            "primary_web_microsoft_host": "",
            "public_network_access_enabled": true,
            "queue_encryption_key_type": "Service",
            "queue_properties": [
              {
                "cors_rule": [],
                "hour_metrics": [
                  {
                    "enabled": true,
                    "include_apis": true,
                    "retention_policy_days": 7,
                    "version": "1.0"
                  }
                ],
                "logging": [
                  {
                    "delete": true,
                    "read": true,
                    "retention_policy_days": 7,
                    "version": "1.0",
                    "write": true
                  }
                ],
                "minute_metrics": [
                  {
                    "enabled": true,
                    "include_apis": true,
                    "retention_policy_days": 7,
                    "version": "1.0"
                  }
                ]
              }
            ],
            "resource_group_name": "nishiyamas-tf-rg",
            "routing": [],
            "sas_policy": [],
            "secondary_access_key": "<キー情報>",
            "secondary_blob_connection_string": "",
            "secondary_blob_endpoint": null,
            "secondary_blob_host": null,
            "secondary_blob_internet_endpoint": null,
            "secondary_blob_internet_host": null,
            "secondary_blob_microsoft_endpoint": null,
            "secondary_blob_microsoft_host": null,
            "secondary_connection_string": "DefaultEndpointsProtocol=https;AccountName=<ストレージアカウント名>;AccountKey=<キー情報>;EndpointSuffix=core.windows.net",
            "secondary_dfs_endpoint": null,
            "secondary_dfs_host": null,
            "secondary_dfs_internet_endpoint": null,
            "secondary_dfs_internet_host": null,
            "secondary_dfs_microsoft_endpoint": null,
            "secondary_dfs_microsoft_host": null,
            "secondary_file_endpoint": null,
            "secondary_file_host": null,
            "secondary_file_internet_endpoint": null,
            "secondary_file_internet_host": null,
            "secondary_file_microsoft_endpoint": null,
            "secondary_file_microsoft_host": null,
            "secondary_location": "",
            "secondary_queue_endpoint": null,
            "secondary_queue_host": null,
            "secondary_queue_microsoft_endpoint": null,
            "secondary_queue_microsoft_host": null,
            "secondary_table_endpoint": null,
            "secondary_table_host": null,
            "secondary_table_microsoft_endpoint": null,
            "secondary_table_microsoft_host": null,
            "secondary_web_endpoint": null,
            "secondary_web_host": null,
            "secondary_web_internet_endpoint": null,
            "secondary_web_internet_host": null,
            "secondary_web_microsoft_endpoint": null,
            "secondary_web_microsoft_host": null,
            "sftp_enabled": false,
            "share_properties": [
              {
                "cors_rule": [],
                "retention_policy": [
                  {
                    "days": 7
                  }
                ],
                "smb": []
              }
            ],
            "shared_access_key_enabled": true,
            "static_website": [],
            "table_encryption_key_type": "Service",
            "tags": {
            },
            "timeouts": null
          },
          "sensitive_attributes": [],
          "private": "<キー情報>"
        }
      ]
    }
  ],
  "check_results": null
}

おわりに

本記事を最後までお読みいただき、ありがとうございます。

本記事がTerraformを使用する際の参考となれば幸いです。

執筆担当者プロフィール
西山 正太郎

西山 正太郎(日本ビジネスシステムズ株式会社)

クラウドソリューション事業本部に所属。近年は業務で主にMicrosoft Azureに携わっています。山登りが趣味です。

担当記事一覧