You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:04:50