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
相关产品推荐
相关产品推荐

