以前、Terraformを一から作成しAzureリソースを作成する手段や、既存リソースを参照し、Terraformにて追加リソースを作成する手段について書きました。
本記事では、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.
実行手順
今回は例として、以下リソースを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!」と表示されます。
リソースのimportを行う
次のコマンドを実行し、リソースのimportを行います。
terraform plan -generate-config-out="<任意のファイル名>.tf"
今回はファイル名を「import_resource.tf」とします。
問題なくインポートされた場合、末尾に「Plan: 2 to import, 0 to add, 0 to change, 0 to destroy.」と表示されます。
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内容に問題がないことを確認し、「yes」を入力後「Enter」を押下します。
問題なく完了すると「Apply complete! Resources: 2 imported, 0 added, 0 changed, 0 destroyed.」と表示されます。
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を使用する際の参考となれば幸いです。