Terraform销毁资源遇ApplicationGatewaySubnetInboundTrafficBlockedByNSG错误求助
问题分析
Azure Application Gateway V2 SKU要求其所在子网的NSG必须始终允许GatewayManager服务标签访问65200-65535端口(用于Azure管理平面与网关的通信)。销毁时Terraform默认按创建顺序的反向销毁资源,当前代码中仅让网关依赖NSG而非NSG规则,导致Terraform可能先删除AllowGatewayManagerInbound规则,此时网关仍存在,触发Azure的端口阻断检查,最终销毁失败。
解决方案
1. 调整代码依赖关系(推荐)
修改Application Gateway模块的depends_on,使其直接依赖NSG规则而非NSG本身。这样Terraform会强制销毁时先删除Application Gateway,再删除NSG规则,避免规则被删除时网关仍存在的冲突。
修改后的代码:
module "app_gateway" { source = "../../modules/app_gateway" name = "${azurerm_resource_group.app.name}-${var.location}" location = azurerm_resource_group.app.location resource_group_name = azurerm_resource_group.app.name vnet_subnet_id = azurerm_subnet.gateway.id app_public_dns_zone = local.app_public_dns_zone a_record_domain_name = local.a_record_subdomain key_vault = local.key_vault ssl_certificates = local.ssl_certificates env = local.suffix tags = var.tags depends_on = [ azurerm_network_security_rule.gateway_allow_gateway_manager_https_inbound ] }
2. 流水线分步销毁(备选)
若无法修改代码依赖,可在Jenkins流水线中拆分销毁步骤,先单独销毁网关,再销毁剩余资源:
# 第一步:仅销毁Application Gateway模块 terraform destroy -target=module.app_gateway -auto-approve # 第二步:销毁剩余所有资源 terraform destroy -auto-approve
3. 额外检查:子网与NSG的关联
确保网关子网已正确关联NSG(若未关联需补充配置),避免其他潜在问题:
resource "azurerm_subnet" "gateway" { name = "gateway" resource_group_name = azurerm_resource_group.app.name virtual_network_name = azurerm_virtual_network.primary.name address_prefixes = ["10.0.1.0/24"] # 关联NSG network_security_group_id = azurerm_network_security_group.gateway.id }
内容的提问来源于stack exchange,提问作者Sunil
相关产品推荐
相关产品推荐

