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

Terraform创建含多自定义Azure Policy的Initiative参数配置报错咨询

解决Terraform创建Azure Policy Initiative时的parameter_values配置问题

你遇到的「Unsupported argument」错误,是因为在azurerm_policy_set_definition的dynamic "policy_definition_reference"块里误用了parameters参数——Terraform AzureRM Provider对这个块只支持parameter_values来传递策略参数,而非parameters。

正确配置方式示例

下面结合自定义策略和计划的场景,给出两种常见的parameter_values配置方法:

1. 直接给策略传递固定参数值

先定义一个带参数的自定义策略:

resource "azurerm_policy_definition" "tag_enforcement" {
  name         = "enforce-resource-tags"
  policy_type  = "Custom"
  mode         = "Indexed"
  display_name = "强制资源添加指定标签"

  policy_rule = jsonencode({
    if = {
      not = {
        field = "tags['[parameters('tagName')]']"
        exists = true
      }
    }
    then = {
      effect = "deny"
    }
  })

  parameters = jsonencode({
    tagName = {
      type = "String"
      metadata = {
        displayName = "标签名称"
        description = "需要强制添加的资源标签名称"
      }
    }
  })
}

然后在Policy Initiative中通过parameter_values传递固定值:

resource "azurerm_policy_set_definition" "custom_initiative" {
  name         = "custom-resource-governance"
  policy_type  = "Custom"
  display_name = "自定义资源治理计划"

  dynamic "policy_definition_reference" {
    for_each = [azurerm_policy_definition.tag_enforcement]
    content {
      policy_definition_id = policy_definition_reference.value.id
      # 用jsonencode包装键值对,键对应策略的参数名,值为固定参数值
      parameter_values = jsonencode({
        tagName = "Environment"
      })
    }
  }
}

2. 引用计划自身的参数传递给策略

如果计划本身也定义了参数,可将计划参数传递给关联的策略:

resource "azurerm_policy_set_definition" "custom_initiative" {
  name         = "custom-resource-governance"
  policy_type  = "Custom"
  display_name = "自定义资源治理计划"

  # 定义计划自身的参数
  parameters = jsonencode({
    initiativeTagName = {
      type = "String"
      metadata = {
        displayName = "计划统一标签名称"
        description = "通过计划统一配置所有关联策略的标签名称"
      }
    }
  })

  dynamic "policy_definition_reference" {
    for_each = [azurerm_policy_definition.tag_enforcement]
    content {
      policy_definition_id = policy_definition_reference.value.id
      # 引用计划参数传递给策略,格式为"[parameters('计划参数名')]"
      parameter_values = jsonencode({
        tagName = "[parameters('initiativeTagName')]"
      })
    }
  }
}

关键注意点

  • parameter_values必须用jsonencode将键值对转为JSON格式,否则会触发语法错误
  • 键名必须和关联策略中定义的参数名完全一致
  • 如果要引用计划参数,需使用Azure Policy的参数引用语法[parameters('参数名')],而非Terraform的变量引用语法

内容的提问来源于stack exchange,提问作者One Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:01:05