以前Terraformを一から作成しAzureリソースを作成する手段や、既存リソースを参照し、Terraformにて追加リソースを作成する手段について書きました。
本記事では、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ファイル内は以下のような記載となっています。
※事前に仮想ネットワーク、サブネットを作成した環境のため、状態が記載されています。
{ "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を押下します。
正常に完了すると、「Successfully configured the backend "azurerm"!」と表示されます。
既存の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 }
おわりに
本記事を最後までお読みいただき、ありがとうございます。
本記事がTerraformを使用する際の参考となれば幸いです。