使用Terraform销毁Azure多公网IP的相关技术咨询
问题
我希望使用Terraform销毁Azure中的公网IP,当前已定义两个需销毁的公网IP资源。由于这些是现有资源,我已配置了一个import块。请问是否需要为这两个资源都添加import块?同时请告知销毁多个公网IP的其他可行方法。
现有配置代码
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>4.0" } } } provider "azurerm" { features {} subscription_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } import { id = provider::azurerm::normalise_resource_id("/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/aaaaaa/providers/Microsoft.Network/publicIPAddresses/TestVm-ip") to = azurerm_public_ip.TestVm } # import { # id = provider::azurerm::normalise_resource_id("/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/websitei-rg/providers/Microsoft.Network/publicIPAddresses/UBUNTU22-IP") # to = azurerm_public_ip.example # } resource "azurerm_public_ip" "TestVm" { name = "TestVm-ip" resource_group_name = "aaaaaa" location = "eastus" allocation_method = "Static" sku = "Standard" } resource "azurerm_public_ip" "example" { name = "UBUNTU22-IP" resource_group_name = "websitei-rg" location = "eastus" allocation_method = "Static" #sku = "Basic" }
解答
是否需要为两个资源都添加import块?
是的,必须为每个要销毁的现有公网IP单独添加import块。Terraform的import块是一对一关联云平台上的现有资源和本地配置中的resource块的,只有完成导入操作,Terraform才能将该资源纳入当前状态(state)管理,后续才能执行销毁命令。你需要取消注释第二个import块,确保两个公网IP都完成导入关联。
销毁多个公网IP的其他可行方法
1. 使用terraform import命令批量导入后销毁
不需要在配置文件中写import块,直接在命令行执行两次导入命令:
terraform import azurerm_public_ip.TestVm "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/aaaaaa/providers/Microsoft.Network/publicIPAddresses/TestVm-ip" terraform import azurerm_public_ip.example "/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/websitei-rg/providers/Microsoft.Network/publicIPAddresses/UBUNTU22-IP"
导入完成后,执行terraform destroy即可同时销毁两个公网IP。
2. 直接使用Azure CLI批量删除
如果不需要通过Terraform维护资源状态,可以直接用Azure CLI命令跳过Terraform,直接删除云资源:
az network public-ip delete --resource-group aaaaaa --name TestVm-ip az network public-ip delete --resource-group websitei-rg --name UBUNTU22-IP
3. 用for_each批量管理资源(适合批量场景)
如果后续需要管理更多公网IP,可以通过for_each将多个资源定义为集合,实现批量导入和销毁:
首先定义变量存储公网IP信息:
variable "public_ips" { type = map(object({ resource_group = string location = string allocation_method = string sku = string })) default = { "TestVm-ip" = { resource_group = "aaaaaa" location = "eastus" allocation_method = "Static" sku = "Standard" }, "UBUNTU22-IP" = { resource_group = "websitei-rg" location = "eastus" allocation_method = "Static" sku = "Basic" } } }
然后用for_each创建resource块:
resource "azurerm_public_ip" "all" { for_each = var.public_ips name = each.key resource_group_name = each.value.resource_group location = each.value.location allocation_method = each.value.allocation_method sku = each.value.sku }
接着可以通过import块或命令批量导入,后续销毁时只需执行一次terraform destroy即可处理所有关联的公网IP。
内容的提问来源于stack exchange,提问作者user27079438
相关产品推荐
相关产品推荐

