Azure容器注册表Terraform模块动态块无法清空白名单IP问题
解决Azure ACR Terraform模块网络规则切换问题:从白名单切回公开访问
问题核心
当前实现通过dynamic "network_rule_set"仅在存在白名单IP/子网时生成网络规则块,但当白名单清空后,该动态块不执行,导致Terraform不会主动移除已存在的network_rule_set配置,无法将ACR切换回公开访问状态。
解决方案
移除network_rule_set的动态判断,改为始终声明该块,通过动态调整default_action和内部规则来实现公开/白名单模式的切换:
1. 优化变量定义(variables.tf)
为可选变量添加默认空列表,简化配置:
variable "allowed_subnet_ids" { type = list(string) description = "List of subnet IDs to be allowed to access the ACR" default = [] } variable "allowed_ips" { type = list(string) description = "White list IP addresses" default = [] } variable "public_network_access_enabled"{ type = bool description = "(Optional) Whether public network access is allowed for the container registry. Defaults to true." default = true }
2. 修改ACR资源配置(main.tf)
resource "azurerm_container_registry" "this" { name = local.acr_name resource_group_name = var.resource_group_name location = var.location sku = var.sku admin_enabled = var.admin_enabled public_network_access_enabled = var.public_network_access_enabled # 始终声明network_rule_set,确保Terraform持续管理该配置 network_rule_set { # 无白名单时default_action设为Allow,等同于公开访问;有白名单时设为Deny,仅允许指定规则访问 default_action = (length(var.allowed_ips) == 0 && length(var.allowed_subnet_ids) == 0) ? "Allow" : "Deny" dynamic "virtual_network" { for_each = var.allowed_subnet_ids content { action = "Allow" subnet_id = virtual_network.value } } dynamic "ip_rule" { for_each = var.allowed_ips content { action = "Allow" ip_range = ip_rule.value } } } }
逻辑说明
- 公开访问模式:当
allowed_ips和allowed_subnet_ids均为空时,default_action设为Allow,此时ACR允许所有公网访问,与Azure门户"允许所有网络访问"逻辑一致。 - 白名单模式:当存在IP/子网白名单时,
default_action设为Deny,仅允许白名单内的资源访问ACR。 - 状态切换:修改白名单变量后,Terraform会自动更新
network_rule_set的配置,无需手动干预,彻底解决规则残留问题。
验证场景
- 初始配置
allowed_ips有值:ACR生成default_action=Deny的网络规则,仅允许指定IP访问。 - 将
allowed_ips改为空列表:Terraform更新network_rule_set为default_action=Allow,移除所有IP规则,ACR恢复公开访问。
内容的提问来源于stack exchange,提问作者E. Erfan
相关产品推荐
相关产品推荐

