如何调用Azure API查询订阅下指定使用区域的资源详情及成本
获取指定区域的资源列表与详情
直接用Azure Resource Graph API即可,它支持批量查询全订阅的资源,你只需要在查询语句中加location过滤,就能筛选出你需要的特定区域资源,同时可直接返回资源的配置、标签、ID等所有详情字段,不需要逐个调用各资源类型的独立接口。
示例查询语句:
Resources | where location == 'chinaeast2' // 替换为你需要查询的区域标识 | project name, type, id, tags, properties
如果用Azure CLI调用可以直接执行az graph query -q "<上面的查询语句>",程序调用的话请求地址为POST https://management.azure.com/providers/Microsoft.ResourceGraph/resources?api-version=2022-10-01,在请求体中传入查询语句和订阅范围即可。
获取指定区域的成本数据
使用Azure Consumption API的Usage Details接口,你可以通过请求参数的过滤条件限定只返回指定区域的成本数据,支持按时间范围、资源维度聚合。
示例过滤参数:$filter=properties/resourceLocation eq 'chinaeast2' and properties/usageStart ge '2024-01-01' and properties/usageEnd le '2024-01-31'
如果需要直接按资源聚合成本,可加上聚合参数:$apply=groupby((properties/resourceId, properties/resourceName), aggregate(properties/pretaxCost sum with totalCost))
拿到的结果可以和上面Resource Graph返回的资源ID做匹配,就能把资源详情和对应成本关联起来。
调用前注意事项
- 两个接口都属于Azure ARM管理接口,调用前需要先获取ARM访问令牌,所用的服务主体或账号需要有对应订阅的资源读取权限和成本数据读取权限
- 过滤用的区域名必须使用Azure官方的小写英文标识(如chinaeast2,不要用显示名“中国东部2”),你可以提前执行
az account list-locations --query "[].{标识:name, 显示名:displayName}" -o table导出所有区域的对应关系,留存你用到的部分即可 - 多订阅场景下,调用时需要在请求参数中指定所有需要查询的订阅ID,两个接口都支持批量跨订阅查询
内容的提问来源于stack exchange,提问作者Mel

