Azure自定义策略:资源一定不能具有未知标记-如何?

问题描述

在此示例中,资源有两个允许的标记名称

  • 环境
  • 客户

我想创建一个策略,如果给定的标签不是以上两种,则将资源评估为不合规。 (请注意,我想避免使用参数,而是将允许的标记名称“烙印”到定义中。)

我尝试了以下代码,但是当它们具有除上述标记之外的其他标签时,它会将资源标记为合规。

  "mode": "Indexed","policyRule": {
    "if": {
      "allOf": [
        {
          "field": "tags","exists": "true"
        },{
          "field": "tags","notContainsKey": "Environment"
        },"notContainsKey": "Client"
        }
      ]
    },"then": {
      "effect": "deny"
    }
  },"parameters": {}
}

有人可以看到我要去哪里吗?

解决方法

如果我理解正确,则可以创建以下资源:

  • 没有标签
  • 仅“客户”标签
  • 仅“环境”标签
  • 仅“客户”和“环境”标签

所有其他情况都必须被阻止。

{
  "mode": "All","policyRule": {
    "if": {
      "not": {
        "value": "[if(equals(length(field('tags')),0),'noTags',if(and(equals(length(field('tags')),1),or(contains(field('tags'),'Environment'),contains(field('tags'),'Client'))),'environmentOrClientTagOnlyExists',2),and(contains(field('tags'),'environmentAndClientTagsExist','atLeastOneNotAllowedTagExists' )  )  )]","in": [
          "noTags","environmentOrClientTagOnlyExists","environmentAndClientTagsExist"
        ]
      }
    },"then": {
      "effect": "deny"
    }
  },"parameters": {}
}