Partager via


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 :

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.

  1. 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 :

  2. Créez une variable d’environnement nommée AZURE_STORAGE_BLOB_URL :

    set AZURE_STORAGE_BLOB_URL=https://pythonazurestorage12345.blob.core.windows.net
    

    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.

  3. 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.

  4. 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.
    set AZURE_CLIENT_ID=00001111-aaaa-2222-bbbb-3333cccc4444
    set AZURE_TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee
    set AZURE_CLIENT_SECRET=Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2
    
  5. Tentative d’exécution du code (qui échoue intentionnellement) :

    python use_blob_auth.py
    
  6. 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.

  7. 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 et pythonazurestorage12345 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.

  8. 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 :

Page du Portail Azure pour le conteneur de blobs, montrant le fichier chargé

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