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

Terraform配置Azure Key Vault网络ACL按环境生效问题

多环境Azure Key Vault网络ACL条件配置解决方案

你的问题出在Terraform不支持直接用三元表达式选择不同的network_acls块定义,三元表达式仅适用于参数赋值,不能控制整个block的声明逻辑。以下是两种可行的配置方案:

方案一:参数级条件赋值(推荐)

直接在network_acls块内通过条件表达式动态设置参数值,最简洁高效:

resource "azurerm_key_vault" "mykeyvault" {
  name                = lower(format("%s-%s", var.environment_name, "key"))

  access_policy {
    tenant_id          = var.tenant_id
    object_id          = var.object_id
    secret_permissions = ["Get"]
  }

  network_acls {
    default_action = contains(["PRE", "PRD"], var.environment_name) ? "Deny" : "Allow"
    bypass         = "AzureServices"
    # 仅在PRE/PRD环境配置IP规则,其他环境留空(自动生效默认允许逻辑)
    ip_rules       = contains(["PRE", "PRD"], var.environment_name) ? ["1.2.3.4/5"] : []
  }
}

说明:

  • 用contains函数判断当前环境是否属于生产类环境(PRE/PRD),动态切换default_action
  • 生产类环境自动加载IP规则,非生产环境IP规则为空,配合default_action = "Allow"实现全网络访问

方案二:Dynamic块条件生成(灵活扩展场景)

如果后续需要更复杂的环境差异化配置,可使用dynamic块实现条件性的block生成:

resource "azurerm_key_vault" "mykeyvault" {
  name                = lower(format("%s-%s", var.environment_name, "key"))

  access_policy {
    tenant_id          = var.tenant_id
    object_id          = var.object_id
    secret_permissions = ["Get"]
  }

  dynamic "network_acls" {
    for_each = [var.environment_name]
    content {
      default_action = contains(["PRE", "PRD"], network_acls.value) ? "Deny" : "Allow"
      bypass         = "AzureServices"
      ip_rules       = contains(["PRE", "PRD"], network_acls.value) ? ["1.2.3.4/5"] : []
    }
  }
}

注意:原代码中存在变量名不一致问题(var.environment_instance和var.environment_name),请统一变量名称避免报错。

内容的提问来源于stack exchange,提问作者nitesh malik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:46:08