Freigeben über


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

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

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. Bibliothekspakete installieren

Fügen Sie in Ihrer Datei requirements.txt Zeilen für das benötigte Client-Bibliothekspaket hinzu und speichern Sie die Datei.

azure-storage-blob
azure-identity

Installieren Sie dann in Ihrem Terminal oder in der Eingabeaufforderung die Anforderungen.

pip install -r requirements.txt

3. Erstellen Sie eine 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. Blob-Speicher aus dem App-Code verwenden

Dieser Abschnitt demonstriert zwei Möglichkeiten, auf Daten im Blob-Container zuzugreifen, den Sie erstellt haben in Beispiel: Azure-Speicher erstellen. Um auf die Daten im Blob-Container zugreifen zu können, muss Ihre App in der Lage sein, sich bei Azure zu authentifizieren und für den Zugriff auf die Daten im Container autorisiert sein. In diesem Abschnitt werden zwei Möglichkeiten vorgestellt, dies zu tun:

  • Die Methode Kennwortlose (Empfohlen) authentifiziert die App durch die Verwendung von DefaultAzureCredential. DefaultAzureCredential ist ein verketteter Berechtigungsnachweis, mit dem eine App (oder Benutzende) anhand einer Reihe verschiedener Berechtigungsnachweise authentifiziert werden können, darunter Berechtigungsnachweise für Entwickler-Tools, Principals für Anwendungsdienste und verwaltete Identitäten.

  • Die Methode Verbindungszeichenfolge verwendet eine Verbindungszeichenfolge für den direkten Zugriff auf das Speicherkonto.

Unter anderem aus den folgenden Gründen empfehlen wir, wann immer möglich, die Methode „Kenntwortlos“ zu verwenden:

  • Eine Verbindungszeichenfolge authentifiziert den verbindenden Agent mit dem Speicherkonto und nicht mit einzelnen Ressourcen innerhalb dieses Kontos. Folglich gewährt eine Verbindungszeichenfolge eine umfassendere Autorisierung, als sie möglicherweise erforderlich ist. Mit „DefaultAzureCredential“ können Sie der Identität, unter der Ihre Anwendung läuft, mithilfe von Azure RBACdetailliertere, weniger privilegierte Berechtigungen für Ihre Speicherressourcen erteilen.

  • Eine Verbindungszeichenfolge enthält Informationen als Klartext und stellt daher potenzielle Sicherheitsrisiken dar, wenn sie nicht ordnungsgemäß aufgebaut oder geschützt ist. Wenn eine solche Verbindungszeichenfolge verfügbar gemacht wird, kann sie für den Zugriff auf eine Vielzahl von Ressourcen im Speicherkonto verwendet werden.

  • Eine Verbindungszeichenfolge wird in der Regel in einer Umgebungsvariablen gespeichert, was ihn anfällig für Kompromisse macht, wenn Angreifende Zugriff auf Ihre Umgebung erhalten. Viele der von „DefaultAzureCredential“ unterstützten Berechtigungsnachweisarten erfordern keine Speicherung von Geheimnissen in Ihrer Umgebung.

DefaultAzureCredential ist eine optionale, vorkonfigurierte Kette von Berechtigungsnachweisen. Er wurde entwickelt, um viele Umgebungen zusammen mit den am häufigsten verwendeten Authentifizierungsflüssen und Entwicklertools zu unterstützen. Eine Instanz von „DefaultAzureCredential“ bestimmt anhand einer Kombination aus ihrer Laufzeitumgebung, dem Wert bestimmter bekannter Umgebungsvariablen und optionalen Parametern, die an ihren Konstruktor übergeben werden, für welche Anmeldetypen sie ein Token zu erhalten versucht.

In den folgenden Schritten konfigurieren Sie einen Anwendungsdienstprinzipal als Anwendungsidentität. Anwendungsdienstprinzipale eignen sich sowohl für die lokale Entwicklung als auch für Apps, die lokal gehostet werden. Um „DefaultAzureCredential“ so zu konfigurieren, dass der Anwendungsdienstprinzipal verwendet wird, setzen Sie die folgenden Umgebungsvariablen: AZURE_CLIENT_ID, AZURE_TENANT_ID und AZURE_CLIENT_SECRET.

Beachten Sie, dass ein Client-Geheimnis konfiguriert ist. Dies ist für einen Anwendungsdienstprinzipal erforderlich, aber je nach Szenario können Sie „DefaultAzureCredential“ auch so konfigurieren, dass Anmeldeinformationen verwendet werden, die keine Festlegung eines Geheimnisses oder Kennworts in einer Umgebungsvariablen erfordern.

Wenn „DefaultAzureCredential“ beispielsweise bei der lokalen Entwicklung kein Token über die konfigurierten Umgebungsvariablen erhalten kann, wird versucht, eines über den (bereits) bei Entwicklungstools wie Azure CLI angemeldete Benutzende zu erhalten. Für eine in Azure gehostete App kann DefaultAzureCredential so konfiguriert werden, dass eine verwaltete Identität verwendet wird. In allen Fällen bleibt der Code in Ihrer App derselbe, nur die Konfiguration und/oder die Runtime-Umgebung ändert sich.

  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. Der Befehl erstellt gleichzeitig die App-Registrierung für die App. Geben Sie dem Dienstprinzipal einen Namen Ihrer Wahl.

    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 der Wert des Kennworts (geheimer Clientschlüssel) nicht erneut angezeigt werden kann. Sie können aber bei Bedarf später ein neues Kennwort hinzufügen, ohne den Dienstprinzipal oder vorhandene Kennwörter ungültig zu machen.

    {
      "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "displayName": "<service-principal-name>",
      "password": "Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2",
      "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
    }
    

    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 an, den Anwendungsdienstprinzipal zu verwenden.

    • 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=00001111-aaaa-2222-bbbb-3333cccc4444
    set AZURE_TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee
    set AZURE_CLIENT_SECRET=Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2
    
  5. Versuchen Sie, den Code auszuführen (bei dem absichtlich ein Fehler auftritt):

    python use_blob_auth.py
    
  6. Beachten Sie die Fehlermeldung „Diese Anforderung ist nicht berechtigt, diesen Vorgang mit dieser Berechtigung auszuführen.“ Die Fehlermeldung 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 Storage Blob Data Contributor-Berechtigungen für den Blob-Container an den Dienstprinzipal mit dem az role assignment create Azure CLI Befehl:

    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 den Platzhalter <AZURE_CLIENT_ID> 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 mit dem Namen „blob-container-01“ die Rolle „Mitwirkender an Storage-Blobdaten“.

    • Ersetzen Sie PythonAzureExample-Storage-rg und pythonazurestorage12345 durch die Ressourcengruppe, die Ihr Speicherkonto enthält, und den genauen Namen Ihres Speicherkontos. Passen Sie bei Bedarf auch den Namen des Blobcontainers an. Wenn Sie den falschen Namen verwenden, erhalten Sie die Fehlermeldung „Der angeforderte Vorgang kann für die verschachtelte Ressource nicht ausgeführt werden. Die übergeordnete Ressource ‚pythonazurestorage12345‘ wurde nicht gefunden.“

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

    Tipp

    Wenn der Befehl „Rollenzuweisung“ beim Verwenden der Bash-Shell die Fehlermeldung „Keine Verbindungsadapter gefunden“ zurückgibt, versuchen Sie, export MSYS_NO_PATHCONV=1 festzulegen, um 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.

Wichtig

In den vorangegangenen Schritten wurde Ihre App unter einem Anwendungsdienstprinzipal ausgeführt. Ein Anwendungsdienstprinzipal benötigt in seiner Konfiguration ein Client-Geheimnis. Sie können jedoch denselben Code verwenden, um die App unter verschiedenen Anmeldetypen auszuführen, die keine explizite Konfiguration eines Kennworts oder Geheimnisses in der Umgebung erfordern. Während der Entwicklung kann „DefaultAzureCredential“ z. B. die Anmeldedaten für das Entwickler-Tool verwenden, wie die Anmeldedaten, die Sie für die Anmeldung über die Azure CLI verwenden, oder für in Azure gehostete Apps eine verwaltete Identität. Weitere Informationen finden Sie unter Authentifizierung von Python-Apps bei Azure-Diensten mit dem Azure SDK für Python.

5: Überprüfen der Blob-Erstellung

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

Die Azure-Portal Seite für den Blobcontainer mit der hochgeladenen Datei

Wenn Sie eine Umgebungsvariable mit dem Namen AZURE_STORAGE_CONNECTION_STRING erstellt haben, können Sie auch mit dem Azure CLI überprüfen, ob das Blob vorhanden ist, indem Sie den Befehl az storage blob list verwenden:

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

Wenn Sie die Anweisungen zur Verwendung der kennwortlosen Authentifizierung befolgt haben, können Sie dem vorhergehenden Befehl den Parameter „--connection-string“ mit der Verbindungszeichenfolge für Ihr Speicherkonto hinzufügen. Um die Verbindungszeichenfolge zu erhalten, verwenden Sie den Befehl az storage account show-connection-string.

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

Verwenden Sie die gesamte Verbindungszeichenfolge als Wert für den Parameter „--connection-string“.

Hinweis

Wenn Ihr Azure-Benutzerkonto die Rolle „Storage Blob Data Contributor“ für den Container hat, können Sie den folgenden Befehl verwenden, um die Blobs im Container aufzulisten:

az storage blob list --container-name blob-container-01 --account-name pythonazurestorage12345 --auth-mode login

6. Bereinigen von Ressourcen

Führen Sie den Befehl az group delete aus, wenn Sie die in diesem Beispiel verwendete Ressourcengruppe und die erstellten Speicherressourcen nicht beibehalten müssen. Ressourcengruppen verursachen keine laufenden Gebühren in Ihrem Abonnement, aber Ressourcen wie Speicherkonten in der Ressourcengruppe können weiterhin Gebühren verursachen. Es hat sich bewährt, jede Gruppe zu bereinigen, 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 unter Beispiel: Erstellen einer Ressourcengruppe veranschaulicht die Verwendung.

Wenn Sie die Anweisungen zur Verwendung der kennwortlosen 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 Platzhalter <AZURE_CLIENT_ID> durch die App-ID Ihres Dienstprinzipals.

az ad app delete --id <AZURE_CLIENT_ID>

Siehe auch