You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python获取Azure订阅所有资源详情并解决API版本适配问题

问题根因

Azure 资源管理接口没有全局通用的latestAPI版本标识,不同资源类型的API版本由所属的资源提供程序独立发布维护,直接传入latest参数无法被接口识别,因此触发报错。

解决思路

提前拉取当前订阅下所有资源提供程序的元数据,缓存每个资源类型对应的最新API版本,调用详情接口时匹配对应版本即可:

  • 优先选取非预览版的最新API版本,没有正式版时再取最新的预览版
  • 从资源ID中解析出资源提供程序命名空间、资源类型,匹配预生成的版本映射
可直接运行的修改后代码
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient

def get_api_version_map(resource_client):
    api_version_map = {}
    # 拉取所有已注册的资源提供程序
    providers = resource_client.providers.list(expand="resourceTypes/aliases,resourceTypes/apiVersions")
    for provider in providers:
        namespace = provider.namespace
        for resource_type in provider.resource_types:
            type_name = resource_type.resource_type
            # 优先取非预览的最新版本
            valid_versions = [v for v in resource_type.api_versions if "preview" not in v.lower()]
            if not valid_versions:
                # 没有正式版则取最新预览版
                valid_versions = resource_type.api_versions
            if valid_versions:
                api_version_map[f"{namespace}/{type_name}".lower()] = valid_versions[0]
    return api_version_map

credential = AzureCliCredential()
subscription_id = "<你的订阅ID>"
client = ResourceManagementClient(credential, subscription_id)

# 预先生成全量资源类型的API版本映射
api_version_map = get_api_version_map(client)

rg_list = [i for i in client.resource_groups.list()]
rg_resources = {}
for rg in rg_list:
    rg_name = rg.name
    rg_resources[rg_name] = client.resources.list_by_resource_group(
        rg_name,
        expand="properties,created_time,changed_time"
    )

data = {}
for rg_name, resources in rg_resources.items():
    details = []
    for resource in resources:
        resource_id = resource.id
        # 从资源ID中解析资源类型
        id_parts = resource_id.split("/providers/")[1].split("/")
        provider_namespace = id_parts[0]
        resource_type = id_parts[1]
        full_type = f"{provider_namespace}/{resource_type}".lower()
        # 匹配对应API版本
        api_version = api_version_map.get(full_type)
        if api_version:
            details.append(client.resources.get_by_id(resource_id, api_version))
    data[rg_name] = details

print(data)
逻辑说明
  • 版本映射仅需要生成一次,后续所有资源查询都可以复用,不会重复请求接口增加开销
  • 适配所有已注册的资源类型,不会出现版本不匹配的报错

内容的提问来源于stack exchange,提问作者user2156115

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 20:36:05