Quels sont quelques exemples de méthodes de journalisation et de gestion des exceptions à l'aide de try/except et DefaultAzureCredential() ?

Exemple:

Lorsque DefaultAzureCredential() est utilisé dans une fonction Python Azure, il génère quelques messages WARNING et l'une des méthodes .get_token de la chaîne d'informations d'identification réussit.

Je souhaite enregistrer ceux qui ont réussi et ceux qui ont échoué.

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.

Et puis cela réussit, mais il n'y a pas de message indiquant lequel a réussi. Dans ce cas, exécuter des extraits dans un fichier .ipynb dans VS Code).

Comment consigner et gérer les erreurs lors de l'utilisation de DefaultAzureCredential() en production ?

Vous cherchez un exemple de quelque chose comme :

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>
1
ericOnline 3 nov. 2020 à 01:40

2 réponses

Meilleure réponse

Il y a plusieurs façons d'aborder cela, mais aucune n'est particulièrement jolie. Au risque d'une suggestion naïve, si vous voulez une compréhension fine de ce qui a fonctionné dans l'ordre, vous pouvez adopter une approche similaire à ce que votre exemple a esquissé en utilisant les informations d'identification des composants répertoriées ici :

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))

Je suggère cela car il ne semble pas que ce que vous voulez soit exposé de manière facilement accessible, en regardant la source ChainedCredential ici (l'historique est construit mais uniquement utilisé dans le message de journal ).

Des approches plus "autonomes" pourraient impliquer la création d'un wrapper personnalisé qui fait essentiellement ce que ChainedCredential fait pour DefaultAzureCredential en exécutant la liste des appels get_token, mais avec plus de possibilité d'exporter l'historique de réussite, vous pourriez probablement pirater le code que j'ai lié dans 2 et faire quelque chose de directement comparable à la logique DefaultAzureCredential, mais en fin de compte, ce sont tous les isomorphismes de l'exemple ci-dessus.

N'hésitez pas à crier si j'ai mal compris certains aspects de la question ou vos exigences/contraintes ; et comme toujours, n'hésitez pas à nous contacter si vous avez besoin de nous contacter sur notre github (divulgation complète, je suis un responsable de certains des autres SDK Python Azure)

2
Kibrantn 2 nov. 2020 à 23:55

Juste pour compléter la réponse acceptée avec quelques détails supplémentaires, permettez-moi d'ajouter que DefaultAzureCredential enregistre ces informations. Par exemple, si vous activez la journalisation au niveau INFO :

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)

Vous verrez des messages de journal comme ceux-ci de DefaultAzureCredential :

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

Vous verrez les tentatives infructueuses enregistrées uniquement la première fois que l'instance DefaultAzureCredential acquiert un jeton. Une fois que l'un de ses identifiants constitutifs fournit un jeton, il utilise exclusivement cet identifiant. Ainsi, ce DefaultAzureCredential particulier s'authentifiera toujours via Visual Studio Code, et dans les journaux, vous verrez ce message chaque fois qu'il le fera :

[INFO] DefaultAzureCredential acquired a token from VisualStudioCodeCredential
1
Charles Lowell 30 janv. 2021 à 00:11