Beispiel: Zugreifen auf Azure Storage mit den Azure-Bibliotheken für Python

In diesem Artikel erfahren Sie, wie Sie die Azure-Clientbibliotheken im Python-Anwendungscode verwenden, um eine Datei in einen Azure Blob Storage-Container hochzuladen. In diesem Artikel wird davon ausgegangen, dass Sie die im Beispiel gezeigten Ressourcen erstellt haben: Erstellen von Azure Storage.

Alle Befehle in diesem Artikel funktionieren in Linux-/macOS-Bash- und Windows-Befehlsshells identisch, sofern nicht anders angegeben.

1: Einrichten Ihrer lokalen Entwicklungsumgebung

Falls noch nicht geschehen, richten Sie eine Umgebung ein, in der Sie diesen Code ausführen können. Hier einige Optionen:

2: Installieren von Bibliothekspaketen

Fügen Sie in Ihrer requirements.txt Datei Zeilen für das Clientbibliothekspaket hinzu, das Sie verwenden und speichern möchten.

azure-storage-blob
azure-identity

Installieren Sie dann in Ihrer Terminal- oder Eingabeaufforderung die Anforderungen.

pip install -r requirements.txt

3: Erstellen einer Datei zum Hochladen

Erstellen Sie eine Quelldatei mit dem Namen sample-source.txt. Dieser Dateiname ist das, was der Code erwartet.

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

4: Verwenden von BLOB-Speicher aus App-Code

Die folgenden beiden Abschnitte veranschaulichen zwei Möglichkeiten für den Zugriff auf den blob-Container, der über Beispiel erstellt wurde: Erstellen von Azure Storage.

Die erste Methode (mit Authentifizierung) authentifiziert die App DefaultAzureCredential wie in authenticate Python apps to Azure services during local development using service principals. Mit dieser Methode müssen Sie zuerst die entsprechenden Berechtigungen der App-Identität zuweisen, was die empfohlene Vorgehensweise ist.

Die zweite Methode (mit Verbindungszeichenfolge) verwendet eine Verbindungszeichenfolge, um direkt auf das Speicherkonto zuzugreifen. Obwohl diese Methode einfacher erscheint, hat Sie zwei bedeutende Nachteile:

  • Eine Verbindungszeichenfolge authentifiziert den Verbindungs-Agent von Natur aus mit dem Speicherkonto anstatt mit einzelnen Ressourcen innerhalb dieses Kontos. Daher gewährt eine Verbindungszeichenfolge eine breitere Autorisierung als erforderlich.

  • Eine Verbindungszeichenfolge enthält Zugriffsinformationen in Nur-Text und stellt daher potenzielle Sicherheitsrisiken dar, wenn sie nicht ordnungsgemäß erstellt oder gesichert sind. Wenn eine solche Verbindungszeichenfolge verfügbar gemacht wird, kann sie verwendet werden, um auf eine vielzahl von Ressourcen innerhalb des Speicherkontos zuzugreifen.

Aus diesen Gründen empfiehlt es sich, in Produktionscode die Authentifizierungsmethode zu verwenden.

4a: Verwenden von BLOB-Speicher mit Authentifizierung

  1. Erstellen Sie eine Datei namens use_blob_auth.py mit folgendem Code. Die Schritte werden in den Kommentaren erläutert.

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

    Referenzlinks:

  2. Erstellen Sie eine Umgebungsvariable namens AZURE_STORAGE_BLOB_URL:

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

    Ersetzen Sie "pythonazurestorage12345" durch den Namen Ihres Speicherkontos.

    Die Umgebungsvariable AZURE_STORAGE_BLOB_URL wird nur in diesem Beispiel verwendet. Sie wird nicht von den Azure-Bibliotheken verwendet.

  3. Verwenden Sie den Befehl "az ad sp create-for-rbac ", um einen neuen Dienstprinzipal für die App zu erstellen. Mit dem Befehl wird die App-Registrierung für die App gleichzeitig erstellt. Weisen Sie dem Dienstprinzipal einen Namen Ihrer Wahl zu.

    az ad sp create-for-rbac --name {service-principal-name}
    

    Die Ausgabe dieses Befehls sollte wie im folgenden Beispiel aussehen. Notieren Sie sich diese Werte, oder lassen Sie dieses Fenster geöffnet, da Sie diese Werte im nächsten Schritt benötigen und den Wert des Kennworts (geheimer Clientschlüssel) nicht erneut anzeigen können. Sie können jedoch später ein neues Kennwort hinzufügen, ohne den Dienstprinzipal oder vorhandene Kennwörter bei Bedarf ungültig zu machen.

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

    Azure CLI-Befehle können in der Azure Cloud Shell oder auf einer Workstation mit installierter Azure CLI ausgeführt werden.

  4. Erstellen sie Umgebungsvariablen für den Anwendungsdienstprinzipal:

    Erstellen Sie die folgenden Umgebungsvariablen mit den Werten aus der Ausgabe des vorherigen Befehls. Diese Variablen weisen DefaultAzureCredential die Verwendung des Anwendungsdienstprinzipals auf.

    • AZURE_CLIENT_ID → Der App-ID-Wert.
    • AZURE_TENANT_ID → Der Wert der Mandanten-ID.
    • AZURE_CLIENT_SECRET → Das für die App generierte Kennwort/Anmeldeinformationen.
    set AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  5. Versuchen Sie, den Code auszuführen (bei dem absichtlich ein Fehler auftritt):

    python use_blob_auth.py
    
  6. Beachten Sie den Fehler "Diese Anforderung ist nicht berechtigt, diesen Vorgang mit dieser Berechtigung auszuführen." Der Fehler wird erwartet, da der von Ihnen verwendete lokale Dienstprinzipal noch nicht über die Berechtigung für den Zugriff auf den BLOB-Container verfügt.

  7. Erteilen sie Mitwirkender Berechtigungen für den BLOB-Container an den Dienstprinzipal, indem Sie den Befehl az role assignment create Azure CLI verwenden:

    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"
    

    Das --assignee Argument identifiziert den Dienstprinzipal. Ersetzen Sie <AZURE_CLIENT_ID> Platzhalter durch die App-ID Ihres Dienstprinzipals.

    Das Argument --scope gibt den Bereich an, in dem diese Rollenzuweisung gilt. In diesem Beispiel gewähren Sie dem Dienstprinzipal für den Container "blob-container-container-01" die Rolle "Storage Blob Data Contributor".

    • Ersetzen Und PythonAzureExample-Storage-rgpythonazurestorage12345 durch die Ressourcengruppe, die Ihr Speicherkonto enthält, und den genauen Namen Ihres Speicherkontos. Passen Sie bei Bedarf auch den Namen des BLOB-Containers an. Wenn Sie den falschen Namen verwenden, erhalten Sie die Fehlermeldung „Angeforderter Vorgang kann nicht auf die geschachtelte Ressource angewendet werden. Die übergeordnete Ressource ‚pythonazurestorage12345‘ wurde nicht gefunden.“

    • Ersetzen Sie den <AZURE_SUBSCRIPTION_ID> Platzhalter durch Ihre Azure-Abonnement-ID. (Sie können den Befehl "az account show" ausführen und Ihre Abonnement-ID aus der Eigenschaft in der id Ausgabe abrufen.)

    Tipp

    Wenn der Befehl "Rollenzuweisung" beim Verwenden der Bash-Shell einen Fehler "Keine Verbindungsadapter gefunden" zurückgibt, versuchen Sie export MSYS_NO_PATHCONV=1 , die Pfadübersetzung zu vermeiden. Weitere Informationen findest du in diesem Issue.

  8. Warten Sie ein bis zwei Minuten, bis die Berechtigungen weitergegeben wurden, und führen Sie den Code dann erneut aus, um zu überprüfen, ob er nun funktioniert. Wird der Berechtigungsfehler erneut angezeigt wird, warten Sie etwas länger, und führen Sie den Code dann erneut aus.

Weitere Informationen zu Rollenzuweisungen finden Sie unter Hinzufügen oder Entfernen von Azure-Rollenzuweisungen mithilfe der Azure-Befehlszeilenschnittstelle.

4b: Verwenden von BLOB-Speicher mit einem Verbindungszeichenfolge

  1. Erstellen Sie eine Python-Datei namens use_blob_conn_string.py und dem folgenden Code. Die Schritte werden in den Kommentaren erläutert.

    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. Erstellen Sie eine Umgebungsvariable namens AZURE_STORAGE_CONNECTION_STRING mit dem Wert der vollständigen Verbindungszeichenfolge für das Speicherkonto. (Diese Umgebungsvariable wird auch von verschiedenen Azure CLI-Kommentaren verwendet.) Sie können die Verbindungszeichenfolge für Ihr Speicherkonto abrufen, indem Sie den Befehl "az storage account show-connection-string" ausführen.

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

    Ersetzen Und PythonAzureExample-Storage-rgpythonazurestorage12345 durch die Ressourcengruppe, die Ihr Speicherkonto enthält, und den genauen Namen Ihres Speicherkontos.

    Wenn Sie die Umgebungsvariable festlegen, verwenden Sie den gesamten Wert der connectionString Eigenschaft in der Ausgabe einschließlich der Anführungszeichen.

  3. Führen Sie den Code aus:

    python use_blob_conn_string.py
    

Erneut, auch wenn diese Methode einfach ist, autorisiert eine Verbindungszeichenfolge alle Vorgänge in einem Speicherkonto. Mit Produktionscode ist es besser, bestimmte Berechtigungen zu verwenden, wie im vorherigen Abschnitt beschrieben.

5. Überprüfen der Blob-Erstellung

Navigieren Sie nach dem Ausführen des Codes einer der beiden Methoden zum Azure-Portal, navigieren Sie zum BLOB-Container, um zu überprüfen, ob ein neues Blob mit dem Namen sample-blob-{random}.txt mit demselben Inhalt wie die sample-source.txt-Datei vorhanden ist:

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

Wenn Sie eine Umgebungsvariable mit dem Namen AZURE_STORAGE_CONNECTION_STRING"Azure CLI" erstellt haben, können Sie auch mithilfe des Befehls "az storage blob list " überprüfen, ob das Blob vorhanden ist:

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

Wenn Sie die Anweisungen zum Verwenden von Blob Storage mit Authentifizierung befolgt haben, können Sie den --connection-string Parameter zum vorherigen Befehl mit dem Verbindungszeichenfolge für Ihr Speicherkonto hinzufügen. Informationen zum Abrufen der Verbindungszeichenfolge finden Sie in den Anweisungen in 4b: Verwenden von BLOB-Speicher mit einem Verbindungszeichenfolge. Verwenden Sie die gesamte Verbindungszeichenfolge einschließlich der Anführungszeichen.

6: Ressourcen bereinigen

Führen Sie den Befehl "az group delete " aus, wenn Sie die in diesem Beispiel verwendete Ressourcengruppe und Speicherressourcen nicht beibehalten müssen. Ressourcengruppen verursachen keine laufenden Gebühren in Ihrem Abonnement, aber Ressourcen, z. B. Speicherkonten, in der Ressourcengruppe können Gebühren anfallen. Es empfiehlt sich, jede Gruppe zu sauber, die Sie nicht aktiv verwenden. Das Argument --no-wait ermöglicht die direkte Rückgabe des Befehls, und es muss nicht auf den Abschluss des Vorgangs gewartet werden.

az group delete -n PythonAzureExample-Storage-rg  --no-wait

Sie können auch die ResourceManagementClient.resource_groups.begin_delete-Methode verwenden, um eine Ressourcengruppe aus dem Code zu löschen. Der Code im Beispiel: Erstellen einer Ressourcengruppe veranschaulicht die Verwendung.

Wenn Sie die Anweisungen zum Verwenden von BLOB-Speicher mit Authentifizierung befolgt haben, sollten Sie den von Ihnen erstellten Anwendungsdienstprinzipal löschen. Sie können den Befehl "az ad app delete " verwenden. Ersetzen Sie den <AZURE_CLIENT_ID> Platzhalter durch die App-ID Ihres Dienstprinzipals.

az ad app delete --id <AZURE_CLIENT_ID>

Weitere Informationen