如何枚举所有subscription下各RGRP内全部资源 regex实现失效求助
全范围存量资源枚举实现方案
核心目标是遍历所有可访问订阅下每个资源组(RGRP)的全部存量资源,无遗漏覆盖所有资源对象,优先用云厂商原生资源管理能力实现,不要依赖正则匹配零散数据做枚举,稳定性和准确率都没有保障。
- 原生资源管理接口/CLI枚举方案(准确率最高,无遗漏)
不需要逐订阅、逐资源组写嵌套循环拉取,直接用全域枚举能力:- 先拉取当前身份有权限访问的所有订阅列表,过滤掉已禁用、已注销的无效订阅
- 调用资源管理平面的全域资源列表接口,接口原生支持跨订阅、跨资源组返回全量资源元数据,包含资源ID、类型、所属资源组、所属订阅、位置、标签、创建时间等全属性,包括嵌套的子资源
- 用CLI执行的话直接跑单条命令即可:
az resource list --query "[].{SubscriptionId:subscriptionId, ResourceGroup:resourceGroup, ResourceName:name, ResourceType:type, ResourceId:id}" -o table,默认枚举当前账号下所有可访问订阅的全部资源,不需要额外遍历资源组 - 注意事项:执行身份需要分配所有目标订阅范围的Reader权限,资源量超过10万条时必须处理接口分页参数,不能只取第一页返回,否则会漏数
- 资源图查询方案(效率最高,适合十万级以上超大规模资源场景)
资源图是专门做跨范围资源检索的服务,查询性能比普通资源列表接口高一个数量级,单条查询就能返回全量跨订阅、跨资源组数据,对应查询语句如下:
返回结果默认覆盖所有有权限范围的资源,包括隐藏资源、嵌套子资源,不会漏数。resources | project subscriptionId, resourceGroup, name, type, id, location, tags
正则(regex)实现方案失效排查与修复
常见误区:不要尝试通过爬取云门户页面内容做资源枚举,门户的接口、页面结构会不定期更新,维护成本极高,且很容易触发接口限流、账号风控,返回内容也不会包含全量嵌套资源。
正则本质是字符串匹配工具,本身不具备资源遍历、分页拉取、权限校验的能力,用来做全量资源枚举的核心逻辑天生就有缺陷,之前的逻辑失效基本逃不过以下几类问题,对应排查即可:
- 数据源不完整导致漏匹配
如果正则是用来匹配门户页面片段、单个接口的非全量返回内容,首先就会漏掉分页数据、未在当前返回段展示的嵌套子资源(比如虚拟机扩展、存储账户容器、数据库子对象这类顶层资源列表不会直接返回的资源),正则只能匹配到已经抓到的文本内容,数据源不全的话正则规则写的再完美也拿不到全量资源。 - 正则规则容错性差
- 资源ID路径长度不固定:普通资源ID格式为
/subscriptions/{subId}/resourceGroups/{rgName}/providers/{resourceProvider}/{resourceType}/{resourceName},但嵌套子资源会多1-N层路径,比如/subscriptions/{subId}/resourceGroups/{rgName}/providers/Microsoft.Compute/virtualMachines/{vmName}/extensions/{extName},如果正则写死了路径段数,会直接漏掉所有嵌套资源 - 字符匹配范围过窄:资源组、资源名称支持大小写字母、数字、横杠、点号、下划线等多种字符,如果正则预设的名称匹配规则只覆盖纯字母数字,会漏掉所有带合法特殊字符的资源
- 格式兼容不足:如果正则写死了字段名大小写、固定的空白/转义字符格式,一旦接口返回的JSON/文本格式有微调,比如加了换行、转义符、字段大小写变化,就会直接匹配失败
- 资源ID路径长度不固定:普通资源ID格式为
- 权限不足导致数据缺失
如果正则依赖的数据源本身因为身份权限不足,只返回了部分订阅、部分资源组的内容,再调整正则也拿不到未授权范围的资源。
对应的修复思路:
- 不要把正则作为资源枚举的核心逻辑,正则只适合在拿到全量资源列表后,做资源名称、ID、标签的过滤匹配,不要用它做数据拉取、遍历的核心逻辑
- 如果要保留正则做辅助匹配,先把正则的匹配源替换为前面提到的全量资源列表接口、资源图返回的完整JSON结果,不要用页面片段、零散接口返回作为匹配源
- 调整资源ID匹配的正则规则,兼容嵌套资源场景,通用匹配规则可以参考:
^/subscriptions/[0-9a-f-]+/resourceGroups/[^/]+/providers(?:/[^/]+/[^/]+)+$,不要写死路径段数,资源组、资源名称段匹配除路径斜杠外的所有合法字符 - 正则匹配时开启忽略大小写模式,匹配前先清洗文本里的多余转义字符、空白字符,避免格式干扰。
内容的提问来源于stack exchange,提问作者eswues
相关产品推荐
相关产品推荐

