在没有标签的情况下创建资源组时 Azure Policy 出现奇怪的行为

Azure Policy weird behaviour while creating resource group without tag

我应用了 Azure 策略,强制用户在创建资源组时分配标签。

当我创建一个新的 VM 然后填写所有字段时,我在同一个向导中创建一个新的资源组,然后单击查看和创建按钮。这次 azure policy 被正确触发并阻止了我,因为新创建的 RG 没有使用标签创建。

但是当我转到资源组策略并单击“添加”以创建新 RG 时。那个时候我不填写标签,那么政策也不会被触发。 我很奇怪为什么这个政策第一次奏效,但第二次就不行了。

{
  "if": {
    "allOf": [
      {
        "field": "tags",
        "exists": "false"
      },
      {
        "field": "type",
        "equals": "Microsoft.Resources/subscriptions/resourceGroups"
      }
    ]
  },
  "then": {
    "effect": "deny"
  }
}

似乎弄明白了,它与 Azure 策略无关,你的策略应该可以正常工作,它可能是在门户中创建资源组的 blade 的错误。

我多次尝试通过 powershell 创建资源组,该策略工作正常。

我的测试政策:

如有必要,您可以在 Github 中提出问题。

您遇到的差异是由资源组的 JSON 表示差异造成的。

根据您在门户中单击的内容,资源组 JSON 可能没有标签 属性,例如:

{
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/foo",
    "name": "foo",
    "location": "eastus",
    "properties": {
        "provisioningState": "Succeeded"
    }
}

其他时候可能会使用空标签创建 属性,例如:

{
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/foo",
    "name": "foo",
    "location": "eastus",
    "properties": {
        "provisioningState": "Succeeded"
    },
    "tags": {}
}

策略规则中的 "exists": "false" 条件只会在 "tags" 属性 缺失或为空时触发,因此具有 "tags": {} 的资源组将绕过您的政策,即使它没有任何标签。