如何在Azure Resource Graph Kusto查询中体现订阅的管理组层级?
问题:在Azure Monitor工作簿中实现带管理组层级的订阅参数
我想要创建一个Azure Monitor工作簿,其中包含可选择订阅的下拉参数。我知晓"subscription picker"参数类型的存在,但希望在参数中包含订阅所属的管理组名称。
当前我使用以下Kusto查询:
resourcecontainers | where type == "microsoft.resources/subscriptions" | extend mgs = properties.managementGroupAncestorsChain | project name, mgs
该查询返回的结果如下:
| name | mgs |
|---|---|
| Sub1 | [{"displayName": "Test and Prod Development Group","name": "testprod" }, {"displayName": "Root Group","name": "b266655a-542b-4ab8-8d8f-6ce387638820"}] |
| Sub2 | [{"displayName":"Sandbox","name":"sandbox"},{"displayName":"Root Group","name":"b266655a-542b-4ab8-8d8f-6ce387638820"}] |
由于无法构建树形参数,我希望将层级格式化为如下形式:
| name | parent |
|---|---|
| Sub1 | Root Group -> Test and Prod Development Group |
| Sub2 | Root Group -> Sandbox |
我尝试使用mv-apply运算符,但多次尝试后发现该运算符不被Azure Resource Graph查询支持,请问有哪些可用的替代方案或运算符?
解决方案
可以利用Azure Resource Graph支持的数组处理函数来实现需求,无需使用mv-apply。以下是修改后的查询:
resourcecontainers | where type == "microsoft.resources/subscriptions" | extend mgs = properties.managementGroupAncestorsChain // 反转管理组链数组,让根管理组排在最前面 | extend reversedMgs = array_reverse(mgs) // 从反转后的数组中提取所有管理组的displayName字段,组成新数组 | extend mgDisplayNames = array_extract_all(reversedMgs, "displayName") // 将数组中的displayName用" -> "连接成字符串 | extend parent = strcat_array(mgDisplayNames, " -> ") // 保留需要的字段 | project name, parent
关键步骤说明:
array_reverse:原mgs数组的顺序是从最接近订阅的子管理组到根管理组,反转后让根组在前,符合"Root Group -> 子组"的展示顺序。array_extract_all:从数组的每个对象中提取displayName属性,生成仅包含管理组名称的数组。strcat_array:将数组中的元素用指定的分隔符(->)拼接成单个字符串,得到期望的层级格式。
这个查询完全基于Azure Resource Graph支持的运算符和函数,可以直接用于工作簿的参数配置中,生成包含管理组层级的订阅选项。
内容的提问来源于stack exchange,提问作者Peter Bons
相关产品推荐
相关产品推荐

