Azure policy 如何在Azure中强制执行标记值的整数

Azure policy 如何在Azure中强制执行标记值的整数,azure-policy,Azure Policy,我有一个Azure策略,它拒绝计算的表达式,下面有错误。我假设问题是,当您在门户中提供标记值时,它们作为字符串传递给ARM,即使要传递整数值。试图弄清楚如何强制标记结果的整数值 { "field": "tags['Longevity']", "less": 1 } 错误 我还可以通过在策略中提供以下格式(即“更少”:1)来重现错误 "field": "[concat('tags[', paramete

我有一个Azure策略,它拒绝计算的表达式,下面有错误。我假设问题是,当您在门户中提供标记值时,它们作为字符串传递给ARM,即使要传递整数值。试图弄清楚如何强制标记结果的整数值

{
 "field": "tags['Longevity']",
 "less": 1
}
错误


我还可以通过在策略中提供以下格式(即“更少”:1)来重现错误

"field": "[concat('tags[', parameters('tagName'), ']')]",
"less": 1

我发现标记的基本系统类型是“system.Collections.Generic.Dictionary`2+ValueCollection[system.String,system.String]”,因此,是的,您的假设是正确的,即当您在门户中提供标记值时,它们将作为字符串传递给ARM,即使要传递整数值

我已经尝试过在下面的策略中为标记值强制一个整数(作为字符串),我相信它是有效的(仅适用于正数),因为如果我提供了

  • “1”位于下面策略的第26行,如果我尝试创建资源(比如Azure VM),则验证通过(如果提供的标记值为0),并且在所有其他情况下验证失败
  • “2”位于下面策略的第26行,如果我尝试创建资源(比如Azure VM),则如果提供的标记值介于-1和1之间,则验证通过,并且在所有其他情况下验证失败
所以我相信,即使底层系统类型的标签是字符串,如果我们提供“less”作为


但是,如果您对Uservoice或反馈论坛感兴趣,您可以提出功能请求以允许非字符串类型的标记值。

Microsoft支持部门提供了答案 答案如下所示,其效果与预期一致。必须使用concat()函数才能避免抱怨方括号内的方括号

{
 "value": "[int(field(concat('tags[', 'Longevity', ']')))]",
 "less": 0
},

INTESTENT,违反直觉,需要在定义中提供值作为
string
,以允许在求值过程中进行整数比较,但令人惊讶的是,它可以很好地处理数字,但不幸的是,它允许输入通过过滤器的字符串值,所以问题仍然存在,如何强制执行整数值Y,您是对的。为此,我们需要一个允许非字符串类型的标记值的特性。这就是我建议在UserVoice中提出相同功能请求的原因,如果感兴趣的话。Added()。下面是Microsoft支持部门发布的解决方案
{
  "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"
}
{
 "value": "[int(field(concat('tags[', 'Longevity', ']')))]",
 "less": 0
},