Exemple : Accédez à Azure Storage en utilisant les bibliothèques Azure pour Python
Dans cet article, vous apprendrez à utiliser les bibliothèques clientes Azure dans le code d’application Python pour télécharger un fichier dans un conteneur de stockage blob Azure. L’article suppose que vous avez créé les ressources montrées dans Exemple : Créer Azure Storage.
Sauf indication contraire, toutes les commandes de cet article fonctionnent de la même façon dans les interpréteurs de commandes Windows et bash Linux/macOS.
1. Configurez votre environnement de développement local
Si vous ne l’avez pas encore fait, configurez un environnement où vous pouvez exécuter ce code. Voici quelques options possibles :
Configurez un environnement virtuel Python en utilisant
venv
ou votre outil de choix. Vous pouvez créer l’environnement virtuel localement ou dans Azure Cloud Shell et y exécuter le code. Assurez-vous d’activer l’environnement virtuel pour commencer à l’utiliser.Utilisez un environnement conda.
Utilisez un conteneur de développement dans Visual Studio Code ou GitHub Codespaces.
2. Installer les packages de la bibliothèque
Dans votre fichier requirements.txt, ajoutez des lignes pour le package de bibliothèque cliente dont vous avez besoin et enregistrez le fichier.
azure-storage-blob
azure-identity
Ensuite, dans votre terminal ou invite de commande, installez les prérequis.
pip install -r requirements.txt
3. Créez un fichier à télécharger
Créez un fichier source nommé sample-source.txt. Ce nom de fichier est celui attendu par le code.
Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.
4. Utilisez le stockage blob à partir du code de l’application
Cette sections présente deux manières d’accéder aux données dans le conteneur blob que vous avez créé dans Exemple : Créer du stockage Azure. Pour accéder aux données dans le conteneur d’objets blob, votre application doit pouvoir s’authentifier auprès d’Azure et être autorisée à accéder aux données dans le conteneur. Cette section présente deux façons de procéder :
La méthode Sans mot de passe (recommandée) authentifie l’application avec
DefaultAzureCredential
.DefaultAzureCredential
est une chaîne d’informations d’identification qui peuvent authentifier une application (ou un utilisateur) à l’aide d’une séquence d’informations d’identification différentes, notamment celles de l’outil développeur, des principaux du service d’application et des identités managées.La méthode Chaîne de connexion utilise une chaîne de connexion pour accéder directement au compte de stockage.
Pour les raisons suivantes et d’autres, nous recommandons d’utiliser la méthode sans mot de passe dans la mesure du possible :
Une chaîne de connexion authentifie l’agent de connexion avec le compte de stockage plutôt qu’avec les ressources individuelles de ce compte. En conséquence, une chaîne de connexion accorde une autorisation plus large que nécessaire. Avec
DefaultAzureCredential
vous pouvez accorder des autorisations plus précises et moins privilégiées sur vos ressources de stockage à l’identité sous laquelle votre application s’exécute à l’aide d’Azure RBAC.Une chaîne de connexion contient des informations d’accès en texte clair et présente donc des vulnérabilités potentielles si elle n’est pas correctement construite ou sécurisée. Si une telle chaîne de connexion est exposée, elle peut être utilisée pour accéder à un large éventail de ressources dans le compte de stockage.
Une chaîne de connexion est généralement stockée dans une variable d’environnement, ce qui la rend vulnérable si un attaquant accède à votre environnement. La plupart des types d’informations d’identification pris en charge par
DefaultAzureCredential
ne nécessitent pas de stockage de secrets dans votre environnement.
DefaultAzureCredential
est une chaîne d’informations d’identification préconfigurée et stricte. Elle est conçue pour prendre en charge de nombreux environnements, ainsi que les flux d’authentification et les outils de développement les plus courants. Une instance de DefaultAzureCredential
détermine quels types d’informations d’identification essayer pour obtenir un jeton en fonction d’une combinaison de son environnement d’exécution, de la valeur de certaines variables d’environnement connues et, éventuellement, des paramètres passés dans son constructeur.
Les étapes suivantes montrent comment configurer un principal de service d’application comme identité d’application. Les principaux de service d’application sont adaptés à l’utilisation pendant le développement local et pour les applications hébergées localement. Pour configurer DefaultAzureCredential
afin d’utiliser le principal du service d’application, définissez les variables d’environnement suivantes : AZURE_CLIENT_ID
, AZURE_TENANT_ID
et AZURE_CLIENT_SECRET
.
Notez qu’une clé secrète client est configurée. Cela est nécessaire pour un principal de service d’application, mais, en fonction de votre scénario, vous pouvez également configurer DefaultAzureCredential
pour utiliser des informations d’identification qui ne nécessitent pas la configuration d’un secret ou d’un mot de passe dans une variable d’environnement.
Par exemple, dans le développement local, si DefaultAzureCredential
ne peut pas obtenir de jeton au moyen de variables d’environnement configurées, il essaie d’en obtenir un à l’aide de l’utilisateur (déjà) connecté aux outils de développement tels que Azure CLI ; pour une application hébergée dans Azure, DefaultAzureCredential
peut être configuré pour utiliser une identité managée. Dans tous les cas, le code de votre application demeure le même, seuls la configuration et/ou l’environnement d’exécution changent.
Créez un fichier nommé use_blob_auth.py avec le code suivant. Les commentaires expliquent les étapes.
import os import uuid from azure.identity import DefaultAzureCredential # Import the client object from the SDK library from azure.storage.blob import BlobClient credential = DefaultAzureCredential() # Retrieve the storage blob service URL, which is of the form # https://<your-storage-account-name>.blob.core.windows.net/ storage_url = os.environ["AZURE_STORAGE_BLOB_URL"] # Create the client object using the storage URL and the credential blob_client = BlobClient( storage_url, container_name="blob-container-01", blob_name=f"sample-blob-{str(uuid.uuid4())[0:5]}.txt", credential=credential, ) # Open a local file and upload its contents to Blob Storage with open("./sample-source.txt", "rb") as data: blob_client.upload_blob(data) print(f"Uploaded sample-source.txt to {blob_client.url}")
Liens de référence :
Créez une variable d’environnement nommée
AZURE_STORAGE_BLOB_URL
:Remplacez « pythonazurestorage12345 » par le nom de votre compte de stockage.
La variable d’environnement
AZURE_STORAGE_BLOB_URL
est utilisée uniquement par cet exemple. Elle n’est pas utilisée par les bibliothèques Azure.Utilisez la commande az ad sp create-for-rbac pour créer un nouveau principal de service pour l’application. La commande crée l’enregistrement de l’application pour l’application en même temps. Donnez au principal de service un nom de votre choix.
az ad sp create-for-rbac --name <service-principal-name>
La sortie de cette commande doit ressembler à l’exemple ci-dessous. Notez ces valeurs ou gardez cette fenêtre ouverte car vous aurez besoin de ces valeurs à l’étape suivante et vous ne pourrez plus voir la valeur du mot de passe (secret client) à nouveau. Vous pouvez, cependant, ajouter un nouveau mot de passe plus tard sans invalider le principal de service ou les mots de passe existants si nécessaire.
{ "appId": "00001111-aaaa-2222-bbbb-3333cccc4444", "displayName": "<service-principal-name>", "password": "Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2", "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee" }
Les commandes Azure CLI peuvent être exécutées dans Azure Cloud Shell ou sur une station de travail dans laquelle l’interface Azure CLI est installée.
Créez des variables d’environnement pour le principal de service de l’application :
Créez les variables d’environnement suivantes avec les valeurs de la sortie de la commande précédente. Ces variables indiquent à
DefaultAzureCredential
d’utiliser le principal de service de l’application.AZURE_CLIENT_ID
→ Valeur de l’ID d’application.AZURE_TENANT_ID
→ Valeur de l’ID de locataire.AZURE_CLIENT_SECRET
→ Mot de passe/informations d’identification générés pour l’application.
Tentative d’exécution du code (qui échoue intentionnellement) :
python use_blob_auth.py
Observez l’erreur « Cette demande n’est pas autorisée à effectuer cette opération en utilisant cette permission ». L’erreur est attendue car le principal de service local que vous utilisez n’a pas encore la permission d’accéder au conteneur blob.
Accordez des autorisations de Contributeur aux données Blob du stockage sur le conteneur d’objet blob au principal de service en utilisant la commande Azure CLI az role assignment create :
az role assignment create --assignee <AZURE_CLIENT_ID> \ --role "Storage Blob Data Contributor" \ --scope "/subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/PythonAzureExample-Storage-rg/providers/Microsoft.Storage/storageAccounts/pythonazurestorage12345/blobServices/default/containers/blob-container-01"
L’argument
--assignee
identifie le principal de service. Remplacez l’espace réservé <AZURE_CLIENT_ID> par l’ID de l’application de votre principal de service.L’argument
--scope
identifie l’emplacement auquel cette attribution de rôle s’applique. Dans cet exemple, vous accordez le rôle « Contributeur de données Blob Storage » au principal de service pour le conteneur nommé « blob-container-01 ».Remplacez
PythonAzureExample-Storage-rg
etpythonazurestorage12345
par le groupe de ressources qui contient votre compte de stockage et le nom exact de votre compte de stockage. Ajustez également le nom du conteneur blob, si nécessaire. Si vous utilisez un nom incorrect, vous obtenez le message d’erreur « Impossible d’effectuer l’opération demandée sur la ressource imbriquée. La ressource parente ’pythonazurestorage12345’ est introuvable ».Remplacez l’espace réservé <AZURE_SUBSCRIPTION_ID> par votre ID d’abonnement Azure. (Vous pouvez exécuter la commande az account show et obtenir votre ID d’abonnement à partir de la propriété
id
dans la sortie).
Conseil
Si la commande d’attribution de rôle renvoie une erreur « Aucun adaptateur de connexion trouvé » lors de l’utilisation de bash shell, essayez de définir
export MSYS_NO_PATHCONV=1
pour éviter la traduction de chemin. Pour plus d’informations, consultez ce problème.Attendez une minute ou deux pour que les autorisations se propagent, réexécutez le code pour vérifier qu’il fonctionne maintenant. Si vous voyez encore l’erreur d’autorisation, attendez un peu, puis réessayez le code.
Pour plus d’informations sur les attributions de rôles, consultez Guide pratique pour attribuer des autorisations de rôle avec l’interface Azure CLI.
Important
dans les étapes précédentes, votre application s’est exécutée sous un principal de service d’application. Ce dernier nécessite une clé secrète client dans sa configuration. Toutefois, vous pouvez utiliser le même code pour exécuter l’application sous différents types d’informations d’identification qui ne vous obligent pas à configurer explicitement un mot de passe ou un secret dans l’environnement. Par exemple, pendant le développement, DefaultAzureCredential
peut utiliser des informations d’identification de l’outil de développement telles que celles que vous utilisez pour vous connecter via Azure CLI ou, pour les applications hébergées dans Azure, il peut utiliser une identité managée. Pour en savoir plus, consultez Authentifier des applications Python auprès des services Azure à l’aide du Kit de développement logiciel (SDK) Azure pour Python.
5. Vérifiez la création du blob
Après avoir exécuté le code de l’une ou l’autre méthode, allez sur le portail Azure, naviguez dans le conteneur blob pour vérifier qu’un nouveau blob existe nommé sample-blob-{aléatoire}.txt avec le même contenu que le fichier sample-source.txt :
Si vous avez créé une variable d’environnement nommée AZURE_STORAGE_CONNECTION_STRING
, vous pouvez également utiliser Azure CLI pour vérifier que le blob existe en utilisant la commande az storage blob list :
az storage blob list --container-name blob-container-01
Si vous avez suivi les instructions pour utiliser l’authentification sans mot de passe, vous pouvez ajouter le paramètre --connection-string
à la commande précédente avec la chaîne de connexion pour votre compte de stockage. Pour obtenir la chaîne de connexion, utilisez la commande az storage account show-connection-string.
az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345 --output tsv
Utilisez l’ensemble de la chaîne de connexion comme valeur pour le paramètre --connection-string
.
Remarque
Si votre compte d’utilisateur Azure a le rôle « Contributeur aux données Blob du stockage » sur le conteneur, vous pouvez utiliser la commande suivante pour répertorier les objets blob dans le conteneur :
az storage blob list --container-name blob-container-01 --account-name pythonazurestorage12345 --auth-mode login
6. Nettoyer les ressources
Exécutez la commande az group delete si vous n’avez pas besoin de conserver le groupe de ressources et les ressources de stockage utilisées dans cet exemple. Les groupes de ressources n’entraînent aucun frais permanent dans votre abonnement, mais des ressources comme les comptes de stockage dans le groupe de ressources peuvent continuer à entraîner des frais. Il est conseillé de nettoyer tout groupe que vous n’utilisez pas activement. L’argument --no-wait
permet à la commande de retourner immédiatement un résultat au lieu d’attendre que l’opération se termine.
az group delete -n PythonAzureExample-Storage-rg --no-wait
Vous pouvez également utiliser la méthode ResourceManagementClient.resource_groups.begin_delete
pour supprimer un groupe de ressources du code. Le code dans Exemple : Créer un groupe de ressources démontre l’utilisation.
Si vous avez suivi les instructions pour utiliser l’authentification sans mot de passe, il est recommandé de supprimer le principal de service de l’application que vous avez créé. Vous pouvez utiliser la commande az ad app delete. Remplacez l’espace réservé <AZURE_CLIENT_ID> par l’ID de l’application de votre principal de service.
az ad app delete --id <AZURE_CLIENT_ID>
Voir aussi
- Démarrage rapide : Bibliothèque de client Stockage Blob Azure pour Python
- Exemple : Créer un groupe de ressources
- Exemple : Lister les groupes de ressources dans un abonnement
- Exemple : Créer une application web et déployer le code
- Exemple : Créer un stockage Azure
- Exemple : Créer et interroger une base de données
- Exemple : Créer une machine virtuelle
- Utiliser des disques managés Azure avec des machines virtuelles
- Répondre à une courte enquête sur le SDK Azure pour Python