如何用Azure资源图查询获取未启用备份的VM的资源ID与名称
解决Azure Resource Graph查询未备份虚拟机并显示资源ID的问题
需求
查找所有未启用备份的Azure虚拟机,需同时展示虚拟机名称和对应的资源ID。
原查询问题
原查询仅能获取虚拟机名称,尝试添加资源ID时遇到两种问题:
- 在
summarize中加入id列分组,会破坏筛选未备份虚拟机的逻辑(原本通过countOfName == 1判断仅在VM列表中存在、不在已备份列表中的VM)。 - 使用
leftouter join再次关联resources表时,触发错误:表resources被作为右表引用了2次,超过了1次的限制。
正确查询方案
使用let语句预先定义已备份虚拟机的集合,再通过leftanti连接直接筛选出未备份的虚拟机,同时保留名称和资源ID:
// Azure Resource Graph Query // 查找所有未启用备份的虚拟机,显示名称和资源ID let backedUpVMs = recoveryservicesresources | where type =~ 'Microsoft.RecoveryServices/vaults/backupFabrics/protectionContainers/protectedItems' | where properties.dataSourceInfo.datasourceType =~ 'Microsoft.Compute/virtualMachines' | project sourceResourceId = properties.sourceResourceId | extend vmName = strcat_array(array_slice(split(sourceResourceId, '/'), 8, -1), '/'); resources | where type =~ 'Microsoft.Compute/virtualMachines' | project name, id | join kind=leftanti (backedUpVMs) on $left.name == $right.vmName
方案说明
let backedUpVMs:先从恢复服务资源中提取所有已启用备份的虚拟机,整理出它们的名称和资源ID。leftanti连接:这种连接类型会返回左表(所有虚拟机)中不存在于右表(已备份虚拟机)的行,直接得到未备份的虚拟机,同时保留name和id字段,逻辑简洁且避免了重复引用resources表的问题。
内容的提问来源于stack exchange,提问作者oZakari
相关产品推荐
相关产品推荐

