我还可以通过在策略中提供以下格式(即“less”:1)来重现错误。
"field": "[concat('tags[', parameters('tagName'), ']')]",
"less": 1
我看到标签的底层系统类型是“System.Collections.Generic.Dictionary`2+ValueCollection[System.String,System.String]”所以是的,你的假设是正确的,即,当您在门户中提供标记值时,即使打算传递整数值,它们也会作为字符串传递给 ARM。
我尝试了以下策略来为标签值强制使用整数(作为字符串),我相信它有点工作(仅适用于正数),因为如果我提供了
- 以下策略第 26 行中的“1”,然后如果我尝试创建资源(例如 Azure VM),则如果提供的标记值为 0,则验证通过,并且在所有其他情况下验证失败。
- 以下策略第 26 行中的“2”,然后如果我尝试创建资源(例如 Azure VM),则如果提供的标记值介于 -1 和 1 之间,则验证通过,并且在所有其他情况下验证失败。
- ...
- ...
- ...
所以我相信即使标签的底层系统类型是字符串,如果我们提供“less”作为condition,数字字符串比较也会在后端进行。
{
"properties": {
"displayName": "Require a tag and its value on resources Test",
"policyType": "Custom",
"mode": "Indexed",
"metadata": {
"version": "1.0.1",
"createdBy": "xxxxxxxxxxxxxxxxxxxxxxx",
"createdOn": "2020-10-22T07:58:29.0108355Z",
"updatedBy": "xxxxxxxxxxxxxxxxxxxxxxx",
"updatedOn": "2020-10-22T10:45:42.4517009Z"
},
"parameters": {
"tagName": {
"type": "String",
"metadata": {
"displayName": "Tag Name",
"description": "Name of the tag, such as 'environment'"
}
}
},
"policyRule": {
"if": {
"not": {
"field": "[concat('tags[', parameters('tagName'), ']')]",
"less": "1"
}
},
"then": {
"effect": "deny"
}
}
},
"id": "/subscriptions/xxxxxxxxxxxxxxxxxxxxxxx/providers/Microsoft.Authorization/policyDefinitions/xxxxxxxxxxxxxxxxxxxxxxx",
"type": "Microsoft.Authorization/policyDefinitions",
"name": "xxxxxxxxxxxxxxxxxxxxxxx"
}
但是,如果有兴趣,在this Uservoice 或反馈论坛中,您可以提出功能请求以允许非字符串类型的标记值。