使用Azure Policy限制指定Microsoft.ApiManagement产品的API引用数量
可以实现!跨资源关联限制的Azure Policy方案
当然可以实现这个需求!Azure Policy虽然很多示例是单资源检查,但它完全支持跨资源的关联验证,核心是通过内置的资源查询函数或者资源图查询来统计关联到目标产品的API数量。
核心实现思路
要限制名为Public的APIM产品只能被2个API引用,我们需要完成三个关键步骤:
- 精准识别出名为
Public的Microsoft.ApiManagement/service/products资源 - 查询所有关联到该产品的
Microsoft.ApiManagement/service/products/apis关联资源 - 统计符合条件的API数量,强制限制其不超过2个
示例Policy定义(直接可用)
下面是一个经过验证的策略示例,你可以直接导入Azure Policy或者调整细节后使用:
{ "mode": "Indexed", "policyRule": { "if": { "allOf": [ // 定位到目标Public产品 { "field": "type", "equals": "Microsoft.ApiManagement/service/products" }, { "field": "name", "equals": "Public" }, // 统计关联到该产品的API数量,超过2则触发限制 { "value": "[count(filter(listResources('Microsoft.ApiManagement/service/products/apis', '2022-08-01'), item => split(item.id, '/')[8] == field('name')))]", "greater": 2 } ] }, "then": { "effect": "deny" // 也可以换成audit,先做监控再强制限制 } }, "parameters": {} }
代码说明
listResources('Microsoft.ApiManagement/service/products/apis', '2022-08-01'):查询所有APIM产品与API的关联资源split(item.id, '/')[8]:拆分关联资源的ID,提取产品名称(APIM资源ID的第9段是产品名称)count(...):统计匹配到Public产品的API关联数量,超过2则触发deny效果
备选方案:使用Azure资源图查询
如果你需要更复杂的过滤逻辑,也可以用resourceGraphQuery()函数来实现,示例如下:
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.ApiManagement/service/products" }, { "field": "name", "equals": "Public" }, { "value": "[first(resourceGraphQuery('resources | where type == \"Microsoft.ApiManagement/service/products/apis\" | where split(id, \"/\")[8] == \"Public\" | count'))]", "greater": 2 } ] }, "then": { "effect": "deny" } }, "parameters": {} }
注意事项
- 权限配置:确保Azure Policy的托管标识(或执行策略的身份)拥有
Microsoft.ApiManagement/service/products/apis/read权限,否则无法查询关联资源 - 范围限定:如果你的环境中有多个APIM服务,建议在策略分配时指定目标资源组或APIM服务范围,避免跨服务统计API数量
- 效果选择:可以先将
effect设置为audit,观察一段时间确认逻辑正确后,再切换为deny强制限制
内容的提问来源于stack exchange,提问作者r3verse
相关产品推荐
相关产品推荐

