Terraformでbackendのストレージアカウントを変更する

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

blog.jbs.co.jp

blog.jbs.co.jp

本記事では、Terraformでbackendブロック内のストレージアカウントを変更する方法について解説します。

Backendとは

BackendはTerraformの状態ファイルを保存する場所を定義します。

格納先としては、ローカルやオブジェクトストレージ等に格納が可能となります。 developer.hashicorp.com

今回はBackendの格納先がストレージアカウントの際の変更手段についてご説明します。 learn.microsoft.com

前提

以下については既に作成済であることを前提に進めます。

  • 元のストレージアカウント、Blobコンテナー
  • 変更後のストレージアカウント、Blobコンテナー

実行手順

今回は以下ストレージアカウントを利用します。

ストレージアカウント

backendブロック内のストレージアカウントの記載を変更する

以下のように、backendブロック内の記載を変更します。

【変更前】

provider "azurerm" {
  features {}
}

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

  # Store Terraform state in Azure Storage
  backend "azurerm" {
    resource_group_name  = "nishiyamas-rg"
    storage_account_name = "<元のストレージアカウント名>" 
    container_name       = "bf-tfstate01"
    # Statment File Name
    key = "migrate_statefile.fstate"
  }
}

【変更後】

provider "azurerm" {
  features {}
}

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

  # Store Terraform state in Azure Storage
  backend "azurerm" {
    resource_group_name  = "nishiyamas-tf-rg"
    storage_account_name = "<変更後のストレージアカウント名>" # 更新
    container_name       = "af-tfstate01" # 更新
    # Statment File Name
    key = "migrate_statefile.tfstate"
  }
}

既存のBlobコンテナー、tfstateファイルを確認する

実行前にの既存Blobコンテナーを確認します。

tfstateファイル

tfstateファイル内は以下のような記載となっています。
※事前に仮想ネットワーク、サブネットを作成した環境のため、状態が記載されています。

{
  "version": 4,
  "terraform_version": "1.6.5",
  "serial": 2,
  "lineage": "***",
  "outputs": {},
  "resources": [
    {
      "mode": "data",
      "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": []
        }
      ]
    },
    {
      "mode": "managed",
      "type": "azurerm_subnet",
      "name": "snet",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "address_prefixes": [
              "10.9.0.0/24"
            ],
            "delegation": [],
            "enforce_private_link_endpoint_network_policies": false,
            "enforce_private_link_service_network_policies": false,
            "id": "/subscriptions/<サブスクリプションID>/resourceGroups/nishiyamas-tf-rg/providers/Microsoft.Network/virtualNetworks/nishiyamas-tf-vnet01/subnets/tf-test-snet01",
            "name": "tf-test-snet01",
            "private_endpoint_network_policies_enabled": true,
            "private_link_service_network_policies_enabled": true,
            "resource_group_name": "nishiyamas-tf-rg",
            "service_endpoint_policy_ids": null,
            "service_endpoints": null,
            "timeouts": null,
            "virtual_network_name": "nishiyamas-tf-vnet01"
          },
          "sensitive_attributes": [],
          "private": "*******",
          "dependencies": [
            "azurerm_virtual_network.vnet",
            "data.azurerm_resource_group.rg"
          ]
        }
      ]
    },
    {
      "mode": "managed",
      "type": "azurerm_virtual_network",
      "name": "vnet",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "address_space": [
              "10.9.0.0/16"
            ],
            "bgp_community": "",
            "ddos_protection_plan": [],
            "dns_servers": [],
            "edge_zone": "",
            "encryption": [],
            "flow_timeout_in_minutes": 0,
            "guid": "*****",
            "id": "/subscriptions/<サブスクリプションID>/resourceGroups/nishiyamas-tf-rg/providers/Microsoft.Network/virtualNetworks/nishiyamas-tf-vnet01",
            "location": "japaneast",
            "name": "nishiyamas-tf-vnet01",
            "resource_group_name": "nishiyamas-tf-rg",
            "subnet": [],
            "tags": {
            },
            "timeouts": null
          },
          "sensitive_attributes": [],
          "private": "******",
          "dependencies": [
            "data.azurerm_resource_group.rg"
          ]
        }
      ]
    }
  ],
  "check_results": null
}

Azureにサインインする

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

 az login --tenant "Tenant ID"

backendの移行をする

terraform init -migrate-stateを実行します。
実行すると、元のストレージアカウントより変更後のストレージアカウントにtfstateファイルがコピーされます。
「Enter a value:」と表示されるため、「yes」と入力し、Enterを押下します。

terraform init -migrate-state実行画面(1)

正常に完了すると、「Successfully configured the backend "azurerm"!」と表示されます。

terraform init -migrate-state実行画面(2)

既存のBlobコンテナー、tfstateファイルを確認する

変更後のBlobコンテナーを確認すると、tfstateファイルが作成されていることが確認できます。

tfstateファイル

tfstateファイル内記載についても同様の内容が記載されています。

{
  "version": 4,
  "terraform_version": "1.6.5",
  "serial": 2,
  "lineage": "***",
  "outputs": {},
  "resources": [
    {
      "mode": "data",
      "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": []
        }
      ]
    },
    {
      "mode": "managed",
      "type": "azurerm_subnet",
      "name": "snet",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "address_prefixes": [
              "10.9.0.0/24"
            ],
            "delegation": [],
            "enforce_private_link_endpoint_network_policies": false,
            "enforce_private_link_service_network_policies": false,
            "id": "/subscriptions/<サブスクリプションID>/resourceGroups/nishiyamas-tf-rg/providers/Microsoft.Network/virtualNetworks/nishiyamas-tf-vnet01/subnets/tf-test-snet01",
            "name": "tf-test-snet01",
            "private_endpoint_network_policies_enabled": true,
            "private_link_service_network_policies_enabled": true,
            "resource_group_name": "nishiyamas-tf-rg",
            "service_endpoint_policy_ids": null,
            "service_endpoints": null,
            "timeouts": null,
            "virtual_network_name": "nishiyamas-tf-vnet01"
          },
          "sensitive_attributes": [],
          "private": "*******",
          "dependencies": [
            "azurerm_virtual_network.vnet",
            "data.azurerm_resource_group.rg"
          ]
        }
      ]
    },
    {
      "mode": "managed",
      "type": "azurerm_virtual_network",
      "name": "vnet",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "address_space": [
              "10.9.0.0/16"
            ],
            "bgp_community": "",
            "ddos_protection_plan": [],
            "dns_servers": [],
            "edge_zone": "",
            "encryption": [],
            "flow_timeout_in_minutes": 0,
            "guid": "*****",
            "id": "/subscriptions/<サブスクリプションID>/resourceGroups/nishiyamas-tf-rg/providers/Microsoft.Network/virtualNetworks/nishiyamas-tf-vnet01",
            "location": "japaneast",
            "name": "nishiyamas-tf-vnet01",
            "resource_group_name": "nishiyamas-tf-rg",
            "subnet": [],
            "tags": {
            },
            "timeouts": null
          },
          "sensitive_attributes": [],
          "private": "******",
          "dependencies": [
            "data.azurerm_resource_group.rg"
          ]
        }
      ]
    }
  ],
  "check_results": null
}

おわりに

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

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

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

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

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

担当記事一覧