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

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的配置,无需手动干预,彻底解决规则残留问题。

验证场景

  1. 初始配置allowed_ips有值:ACR生成default_action=Deny的网络规则,仅允许指定IP访问。
  2. 将allowed_ips改为空列表:Terraform更新network_rule_set为default_action=Allow,移除所有IP规则,ACR恢复公开访问。

内容的提问来源于stack exchange,提问作者E. Erfan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:15:41