使用Azure Python SDK无法获取Azure订阅的问题求助
问题根源
你混用了异步版的凭证(azure.identity.aio.ClientSecretCredential)和同步版的客户端(azure.mgmt.resource.SubscriptionClient)。同步客户端的认证逻辑会直接调用凭证的get_token方法,但异步版凭证的get_token返回的是协程对象(需要await才能拿到token),同步逻辑无法处理这种异步返回值,因此抛出AttributeError和未await的警告。
解决方法
方法一:使用同步版凭证(适配现有同步代码)
直接替换异步凭证为同步版,不需要修改其他代码逻辑:
from azure.identity import ClientSecretCredential # 替换为同步版凭证 from azure.mgmt.resource import SubscriptionClient import json data = json.load(open("parameters.json")) credential = ClientSecretCredential( tenant_id=data["tenant"], client_id=data["client_id"], client_secret=data["client_secret"], ) subs = SubscriptionClient(credential=credential) l = list(subs.subscriptions.list()) print(l)
方法二:改用异步版客户端(适合异步流程)
如果需要保留异步凭证,必须搭配异步版的SubscriptionClient,并基于asyncio运行整个流程:
from azure.identity.aio import ClientSecretCredential from azure.mgmt.resource.aio import SubscriptionClient # 异步版客户端 import json import asyncio async def fetch_subscriptions(): data = json.load(open("parameters.json")) credential = ClientSecretCredential( tenant_id=data["tenant"], client_id=data["client_id"], client_secret=data["client_secret"], ) # 使用async with管理客户端生命周期 async with SubscriptionClient(credential=credential) as client: subscriptions = [] async for sub in client.subscriptions.list(): subscriptions.append(sub) print(subscriptions) await credential.close() asyncio.run(fetch_subscriptions())
关于Azure CLI的疑问
Azure CLI内部使用的是同步版凭证,且CLI的执行框架已经封装了同步/异步的兼容逻辑,因此可以正常使用SubscriptionClient。它的实现和你直接混用异步凭证+同步客户端的场景完全不同。
内容的提问来源于stack exchange,提问作者SodaCris
相关产品推荐
相关产品推荐

