我可以获取Azure下标列表
using REST API
.
但是,当我切换到
Azure Python SDK
,似乎有一些问题。
这是迄今为止的代码:
from azure.identity.aio 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)
我使用一个附加
list
在pnultimate行中,因为
subs.subscriptions.list()
返回一个迭代器。尽管如此,代码似乎相当简单。
但是,此代码会出现以下错误:
Traceback (most recent call last):
File "c:\Users\azureuser\Documents\GitHub\vmss-scripts\vm_create.py", line 14, in <module>
l = list(subs.subscriptions.list())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\core\paging.py", line 123, in __next__
return next(self._page_iterator)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\core\paging.py", line 75, in __next__
self._response = self._get_next(self.continuation_token)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\mgmt\resource\subscriptions\v2022_12_01\operations\_operations.py", line 526, in get_next
pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\core\pipeline\_base.py", line 230, in run
return first_node.send(pipeline_request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\core\pipeline\_base.py", line 86, in send
response = self.next.send(request)
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\core\pipeline\_base.py", line 86, in send
response = self.next.send(request)
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\core\pipeline\_base.py", line 86, in send
response = self.next.send(request)
^^^^^^^^^^^^^^^^^^^^^^^
[Previous line repeated 2 more times]
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\mgmt\core\policies\_base.py", line 46, in send
response = self.next.send(request)
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\core\pipeline\policies\_redirect.py", line 197, in send
response = self.next.send(request)
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\core\pipeline\policies\_retry.py", line 531, in send
response = self.next.send(request)
^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\core\pipeline\policies\_authentication.py", line 124, in send
self.on_request(request)
File "C:\Users\azureuser\scoop\apps\python\current\Lib\site-packages\azure\core\pipeline\policies\_authentication.py", line 100, in on_request
self._update_headers(request.http_request.headers, self._token.token)
^^^^^^^^^^^^^^^^^
AttributeError: 'coroutine' object has no attribute 'token'
sys:1: RuntimeWarning: coroutine 'GetTokenMixin.get_token' was never awaited
我不知道遗漏了什么,这个错误也没有提供太多信息。
似乎与有关
token
。我可以使用以下方法获取令牌:
async def print_token():
token = await credential.get_token("https://management.azure.com/.default")
print(token.token)
await credential.close()
asyncio.run(print_token())
但这需要
asyncio
运行,这与我的代码不兼容。我应该把代币放在哪里?
我已经调查了源代码,如果
Azure CLI
。它似乎使用相同的方法获取订阅:
https://github.com/Azure/azure-cli/blob/f369cead2604e37480611b0cc269fee615956ea2/src/azure-cli-core/azure/cli/core/_profile.py#L835
客户端是从下面的函数中获取的,类型为
https://github.com/Azure/azure-cli/blob/f369cead2604e37480611b0cc269fee615956ea2/src/azure-cli-core/azure/cli/core/profiles/_shared.py#L60
本质上是
SubscriptionClient
.