Exemple : Accéder à Stockage Azure à l’aide des bibliothèques Azure pour Python

Dans cet article, vous allez apprendre à utiliser les bibliothèques clientes Azure dans le code d’application Python pour charger un fichier dans un conteneur de stockage Blob Azure. L’article part du principe que vous avez créé les ressources indiquées dans l’exemple : Créer Stockage Azure.

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 : Configurer votre environnement de développement local

Si ce n’est déjà fait, configurez un environnement dans lequel vous pouvez exécuter ce code. Voici quelques options possibles :

2 : Installer des packages de bibliothèque

Dans votre fichier requirements.txt , ajoutez des lignes pour le package de bibliothèque cliente que vous utiliserez et enregistrez le fichier.

azure-storage-blob
azure-identity

Ensuite, dans votre terminal ou invite de commandes, installez les exigences.

pip install -r requirements.txt

3 : Créer un fichier à charger

Créez un fichier source nommé sample-source.txt. Ce nom de fichier est ce que le code attend.

Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.

4 : Utiliser le stockage d’objets blob à partir du code de l’application

Les deux sections suivantes illustrent deux façons d’accéder au conteneur d’objets blob créé par l’intermédiaire de l’exemple : Créer Stockage Azure.

La première méthode (avec authentification) authentifie l’application DefaultAzureCredential comme décrit dans Authentifier les applications Python auprès des services Azure pendant le développement local à l’aide de principaux de service. Avec cette méthode, vous devez d’abord attribuer les autorisations appropriées à l’identité de l’application, qui est la pratique recommandée.

La deuxième méthode (avec chaîne de connexion) utilise un chaîne de connexion pour accéder directement au compte de stockage. Bien que cette méthode semble plus simple, elle présente deux inconvénients majeurs :

  • Une chaîne de connexion authentifie par nature l’agent de connexion avec le compte de stockage plutôt qu’avec les ressources individuelles de ce compte. Par conséquent, une chaîne de connexion accorde une autorisation plus large que possible.

  • Une chaîne de connexion contient des informations d’accès en texte brut 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 au sein du compte Stockage.

Pour ces raisons, nous vous recommandons d’utiliser la méthode d’authentification dans le code de production.

4a : Utiliser le stockage d’objets blob avec l’authentification

  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 AZURE_STORAGE_BLOB_URL variable d’environnement 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 principal de service pour l’application. La commande crée l’inscription d’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 laissez cette fenêtre ouverte, car vous aurez besoin de ces valeurs à l’étape suivante et ne pourrez plus afficher la valeur de mot de passe (clé secrète client). Toutefois, vous pouvez ajouter un nouveau mot de passe ultérieurement sans invalider le principal de service ou les mots de passe existants si nécessaire.

    {
      "appId": "00000000-0000-0000-0000-000000000000",
      "displayName": "{service-principal-name}",
      "password": "abcdefghijklmnopqrstuvwxyz",
      "tenant": "11111111-1111-1111-1111-111111111111"
    }
    

    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 du service d’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 du service d’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=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  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 à l’aide de cette autorisation ». L’erreur est attendue, car le principal de service local que vous utilisez n’a pas encore l’autorisation d’accéder au conteneur d’objets blob.

  7. Accordez contributeur autorisations sur le conteneur d’objets blob au principal du service à l’aide de la commande az role assignment create Azure CLI :

    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 <AZURE_CLIENT_ID> espace réservé par l’ID d’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 Stockage » au principal du service pour le conteneur nommé « blob-container-01 ».

    • Remplacez et pythonazurestorage12345 utilisez PythonAzureExample-Storage-rg 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 d’objets 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 le <> AZURE_SUBSCRIPTION_ID place réservé par votre ID d’abonnement Azure. (Vous pouvez exécuter la commande az account show et obtenir votre ID d’abonnement à partir de la id propriété dans la sortie.)

    Conseil

    Si la commande d’attribution de rôle retourne une erreur « Aucune carte de connexion n’a été trouvée » lors de l’utilisation de l’interpréteur de commandes Bash, essayez de définir export MSYS_NO_PATHCONV=1 pour éviter la traduction de chemin d’accès. 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.

4b : Utiliser le stockage d’objets blob avec un chaîne de connexion

  1. Créez un fichier Python nommé use_blob_conn_string.py avec le code suivant. Les commentaires expliquent les étapes.

    import os
    import uuid
    
    # Import the client object from the SDK library
    from azure.storage.blob import BlobClient
    
    # Retrieve the connection string from an environment variable. Note that a
    # connection string grants all permissions to the caller, making it less
    # secure than obtaining a BlobClient object using credentials.
    conn_string = os.environ["AZURE_STORAGE_CONNECTION_STRING"]
    
    # Create the client object for the resource identified by the connection
    # string, indicating also the blob container and the name of the specific
    # blob we want.
    blob_client = BlobClient.from_connection_string(
        conn_string,
        container_name="blob-container-01",
        blob_name=f"sample-blob-{str(uuid.uuid4())[0:5]}.txt",
    )
    
    # 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}")
    
  2. Créez une variable d’environnement nommée AZURE_STORAGE_CONNECTION_STRING, dont la valeur est la chaîne de connexion complète pour le compte de stockage. (Cette variable d’environnement est également utilisée par différents commentaires Azure CLI.) Vous pouvez obtenir le chaîne de connexion de votre compte de stockage en exécutant la commande az storage account show-connection-string.

    az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345
    

    Remplacez et pythonazurestorage12345 utilisez PythonAzureExample-Storage-rg le groupe de ressources qui contient votre compte de stockage et le nom exact de votre compte de stockage.

    Lorsque vous définissez la variable d’environnement, utilisez la valeur entière de la connectionString propriété dans la sortie, y compris les guillemets.

  3. Exécutez le code :

    python use_blob_conn_string.py
    

Là encore, bien que cette méthode soit simple, une chaîne de connexion autorise toutes les opérations dans un compte de stockage. Avec le code de production, il est préférable d’utiliser des autorisations spécifiques, comme décrit dans la section précédente.

5. Vérifier la création d’objets blob

Après avoir exécuté le code de l’une ou l’autre méthode, accédez au Portail Azure, accédez au conteneur d’objets blob pour vérifier qu’un nouvel objet blob existe nommé sample-blob-{random}.txt avec le même contenu que le fichier sample-source.txt :

Azure portal page for the blob container, showing the uploaded file

Si vous avez créé une variable d’environnement nommée AZURE_STORAGE_CONNECTION_STRING, vous pouvez également utiliser Azure CLI pour vérifier que l’objet blob existe à l’aide de la commande az storage blob list :

az storage blob list --container-name blob-container-01

Si vous avez suivi les instructions pour utiliser le stockage d’objets blob avec l’authentification, vous pouvez ajouter le --connection-string paramètre à la commande précédente avec le chaîne de connexion de votre compte de stockage. Pour savoir comment obtenir le chaîne de connexion, consultez les instructions de 4b : Utiliser le stockage d’objets blob avec un chaîne de connexion. Utilisez l’ensemble chaîne de connexion y compris les guillemets.

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 pas de frais continus dans votre abonnement, mais les ressources, comme les comptes de stockage, dans le groupe de ressources peuvent entraîner des frais. Il est recommandé de propre un 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 l’exemple : Créer un groupe de ressources illustre l’utilisation.

Si vous avez suivi les instructions pour utiliser le stockage d’objets blob avec l’authentification, il est judicieux de supprimer le principal du service d’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 d’application de votre principal de service.

az ad app delete --id <AZURE_CLIENT_ID>

Voir aussi