Azure Policy定义求助:限制含特定关键词的预留子网操作
问题排查与修正方案
解析失败原因
你编写的Policy里使用了matchAny操作符,但Azure Policy规则表达式并不支持这个操作符,这是导致解析失败的直接原因。此外,原Policy的字段路径也存在问题:针对子网资源本身时,无需使用Microsoft.Network/virtualNetworks/subnets[*].name,直接用name字段即可定位子网名称。
满足需求的完整Policy定义
以下Policy会同时实现两个核心需求:
- 禁止修改、删除名称包含"123"或"reserved"的子网;
- 禁止在这类子网下部署任何资源。
{ "mode": "All", "policyRule": { "if": { "anyOf": [ // 场景1:针对子网本身的修改/删除操作 { "allOf": [ { "field": "type", "equals": "Microsoft.Network/virtualNetworks/subnets" }, { "anyOf": [ { "field": "name", "contains": "123" }, { "field": "name", "contains": "reserved" } ] } ] }, // 场景2:针对部署到目标子网的资源操作 { "allOf": [ { "field": "Microsoft.Network/virtualNetworks/subnets/id", "exists": true }, { "anyOf": [ { "field": "Microsoft.Network/virtualNetworks/subnets/id", "contains": "123" }, { "field": "Microsoft.Network/virtualNetworks/subnets/id", "contains": "reserved" } ] } ] } ] }, "then": { "effect": "Deny" } } }
关键说明
- 使用
anyOf组合两个场景,只要满足其中一个就触发Deny效果; - 针对子网本身,通过
name字段结合contains判断名称是否包含指定字符串; - 针对部署到子网的资源,通过
Microsoft.Network/virtualNetworks/subnets/id字段判断关联的子网ID是否包含目标字符串(子网ID中会包含子网名称); - 模式设为
All,确保覆盖所有资源类型和操作类型(包括修改、删除、部署)。
内容的提问来源于stack exchange,提问作者PRAVEEN PDBR
相关产品推荐
相关产品推荐

