如何通过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
相关产品推荐
相关产品推荐

