Azure资源组标签策略:强制标签值为@contoso.com结尾的邮箱格式问题求助
Azure资源组标签策略:强制标签值为@contoso.com结尾的邮箱格式问题求助
我来帮你梳理下当前策略的问题,以及给出修正方案~
首先看你当前策略的逻辑漏洞:你用了allOf把三个条件绑定在一起,这意味着只有同时满足「是资源组」「指定标签不存在」「标签值不符合@contoso.com格式」这三个情况时,才会触发拒绝操作。但这里有两个明显的问题:
- 当标签存在但值不符合格式时,第二个条件「标签不存在」不成立,整个
allOf就不满足,策略自然不会拒绝这种违规情况(这就是你输入12345能创建资源组的原因) - 当标签不存在时,第三个条件检查标签值的规则其实是无效的(因为字段根本不存在),这时候
allOf也不会成立,导致标签缺失的情况也不会被拦截
正确的逻辑应该是:只要是资源组,且要么标签不存在,要么标签存在但值不符合格式,就拒绝。我们需要把标签相关的两个条件放到anyOf里,再和资源组类型的条件用allOf组合。
另外,你原本的代码里硬编码了tags['CreatedBy'],但又设置了tagName参数,这会导致参数没起到作用,统一改成参数化的字段引用就好。
下面是修正后的策略代码:
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Resources/subscriptions/resourceGroups" }, { "anyOf": [ { "field": "[concat('tags[', parameters('tagName'), ']')]", "exists": false }, { "field": "[concat('tags[', parameters('tagName'), ']')]", "notLike": "*@contoso.com" } ] } ] }, "then": { "effect": "deny" } }, "parameters": { "tagName": { "type": "String", "metadata": { "displayName": "Tag Name", "description": "Name of the tag, such as 'CreatedBy'" } } } }
简单解释下调整点:
- 把标签不存在和标签值不符合的条件放到
anyOf中,只要满足其中一个就会触发后续检查 - 统一使用
[concat('tags[', parameters('tagName'), ']')]来引用标签,让tagName参数真正生效,不用每次修改策略,直接在分配时指定标签名即可 - 保留
allOf包裹资源组类型检查和标签规则组合,确保只对资源组生效
这样调整后,无论是标签缺失,还是标签值不以@contoso.com结尾(比如输入12345),都会被策略拦截啦。
备注:内容来源于stack exchange,提问作者ts ts
相关产品推荐
相关产品推荐

