Python中通过密钥名称获取Azure密钥值时遇错误求助
问题排查:Azure密钥值获取时的AttributeError与RuntimeWarning
错误信息
AttributeError: 'coroutine' object has no attribute 'token' sys:1: RuntimeWarning: coroutine 'AzureCliCredential.get_token' was never awaited
问题原因
你混用了异步身份认证组件和同步密钥客户端:
- 从
azure.identity.aio导入的AzureCliCredential是异步实现,其get_token方法返回协程对象(coroutine) - 而
azure.keyvault.secrets.SecretClient是同步客户端,它会直接尝试访问get_token返回值的token属性,但协程对象没有这个属性;同时因为未使用await调用异步方法,触发了RuntimeWarning
解决方案
方案1:使用异步SecretClient(推荐)
将同步的SecretClient替换为异步版本,保持整个调用链的异步一致性:
修改secrets.py:
from azure.identity.aio import AzureCliCredential # 导入异步版SecretClient from azure.keyvault.secrets.aio import SecretClient KVUri = f"https://{keyVaultName}.vault.azure.net" credential = AzureCliCredential() # 使用异步SecretClient实例化 secret_client = SecretClient(vault_url=KVUri, credential=credential) async def get_secret(name: str): secret = await secret_client.get_secret(name) return secret.value
main.py代码无需修改,保持原有异步调用逻辑即可。
方案2:改用同步AzureCliCredential
如果不需要异步逻辑,可以切换为同步身份认证组件,配合同步SecretClient:
修改secrets.py:
# 导入同步版AzureCliCredential from azure.identity import AzureCliCredential from azure.keyvault.secrets import SecretClient KVUri = f"https://{keyVaultName}.vault.azure.net" credential = AzureCliCredential() secret_client = SecretClient(vault_url=KVUri, credential=credential) # 改为同步函数 def get_secret(name: str): secret = secret_client.get_secret(name) return secret.value
对应调整main.py的调用逻辑:
def print_hi(name): print(f'Hi, {name}') secret_value = secrets.get_secret("order-cat-appinsights-instrumentation-key") print(f"Secret value is {secret_value}") if __name__ == '__main__': print_hi('PyCharm')
验证
两种方案均可解决上述错误,运行代码后能正常从Azure密钥保管库获取密钥值。
内容的提问来源于stack exchange,提问作者Auroops
相关产品推荐
相关产品推荐

