正在使用Python SDK验证`DefaultAzureCredential()`吗?

2024-05-19 18:49:27 发布

您现在位置:Python中文网/ 问答频道 /正文

使用try/except和DefaultAzureCredential()记录和处理异常的一些示例方法是什么

示例:

当在Python Azure函数中使用DefaultAzureCredential()时,它会生成一些WARNING消息,并且凭证链中的一个.get_token方法成功

我想记录哪些成功,哪些失败。

WARNING:azure.identity._internal.decorators:EnvironmentCredential.get_token failed: EnvironmentCredential authentication unavailable. Environment variables are not fully configured.

WARNING:azure.identity._internal.decorators:ManagedIdentityCredential.get_token failed: ManagedIdentityCredential authentication unavailable, no managed identity endpoint found.

WARNING:azure.identity._internal.decorators:SharedTokenCacheCredential.get_token failed: SharedTokenCacheCredential authentication unavailable. No accounts were found in the cache.

WARNING:azure.identity._internal.decorators:VisualStudioCodeCredential.get_token failed: Failed to get Azure user details from Visual Studio Code.

然后它就成功了,但是没有消息表明哪一个成功了。在本例中,在.ipynb文件(VS代码)中运行代码段

在生产中使用DefaultAzureCredential()时如何记录和处理错误?

正在查找类似以下内容的示例:

try:
    credentials = DefaultAzureCredential()
    logging.info(f'<whichever>.get_token succeeded')
except Error1 as e1:
    logging.error(f'EnvironmentCredential.get_token failed: EnvironmentCredential authentication unavailable. Environment variables are not fully configured.', e1)
except Error2 as e2:
    logging.error(f'ManagedIdentityCredential.get_token failed: ManagedIdentityCredential authentication unavailable, no managed identity endpoint found.', e2)
...<etc>

Tags: decoratorstokengetauthentication记录azureidentityinternal
2条回答

为了用更多的细节补充已接受的答案,让我补充一下DefaultAzureCredential确实记录了这些信息。例如,如果启用信息级别日志记录:

import logging
from azure.identity import DefaultAzureCredential

logger = logging.getLogger('azure.identity')
logger.setLevel(logging.INFO)

handler = logging.StreamHandler(stream=sys.stdout)
formatter = logging.Formatter('[%(levelname)s %(name)s] %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

您将在DefaultAzureCredential中看到如下日志消息:

[INFO] DefaultAzureCredential - EnvironmentCredential is unavailable
[INFO] DefaultAzureCredential - ManagedIdentityCredential is unavailable
[INFO] DefaultAzureCredential - SharedTokenCacheCredential is unavailable
[INFO] DefaultAzureCredential acquired a token from VisualStudioCodeCredential

您将看到仅在DefaultAzureCredential实例第一次获取令牌时记录的失败尝试。一旦它的一个组成凭证提供了令牌,它就专门使用该凭证。因此,这个特定的DefaultAzureCredential将始终通过Visual Studio代码进行身份验证,并且在日志中,每当它这样做时,您将看到以下消息:

[INFO] DefaultAzureCredential acquired a token from VisualStudioCodeCredential

我有几种方法可以做到这一点,但没有一种方法特别漂亮。冒着天真建议的风险,如果您希望对顺序中的工作进行细粒度的理解,您可以采取类似于您的示例使用列出的组件凭据所绘制的方法here

for credential in [EnvironmentCredential, ManagedIdentityCredential, ...]:
  try:
    credentials = credential()
    # Validate credential functionality...
    logging.info('{}.get_token succeeded'.format(credential))
  except Error1 as e1:
    logging.error('{} failed due to {}'.format(credential, e1))

我建议这样做是因为它看起来不像是以一种易于访问的方式公开您想要的内容,查看ChainedCredential源代码here(历史是建立的,但只在日志消息中使用)

更多的“自包含”方法可能涉及创建一个自定义包装器,它基本上完成了ChainedCredential在运行get_令牌调用列表时为DefaultAzureCredential所做的工作,但如果能够导出成功历史记录,您可能会从我在2中链接的代码中删除它,并做一些与the DefaultAzureCredential logic直接类似的事情,但归根结底,这都是上述样本的同构

如果我误解了问题的某些方面或您的要求/限制,请不要犹豫,大声喊叫;如果您需要与我们联系,请随时联系我们on our github(完全公开,我是其他一些Python Azure SDK的维护者)

相关问题 更多 >