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:
Konfigurieren Sie eine virtuelle Python-Umgebung mithilfe von
venv
oder dem Tool Ihrer Wahl. Sie können die virtuelle Umgebung lokal oder in Azure Cloud Shell erstellen und den Code dort ausführen. Stellen Sie sicher, dass Sie die virtuelle Umgebung aktivieren, um sie verwenden zu können.Verwenden Sie eine Conda-Umgebung.
Verwenden Sie einen Entwicklungscontainer in Visual Studio Code oder GitHub Codespaces.
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.
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:
Erstellen Sie eine Umgebungsvariable namens
AZURE_STORAGE_BLOB_URL
: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.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.
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.
Versuchen Sie, den Code auszuführen (bei dem absichtlich ein Fehler auftritt):
python use_blob_auth.py
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.
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
undpythonazurestorage12345
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.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:
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
- Schnellstart: Azure Blob Storage-Clientbibliothek für Python
- Beispiel: Erstellen einer Ressourcengruppe
- Beispiel: Auflisten von Ressourcengruppen in einem Abonnement
- Beispiel: Erstellen einer Web-App und Bereitstellen von Code
- Beispiel: Erstellen einer Azure Storage-Instanz
- Beispiel: Erstellen und Abfragen einer Datenbank
- Beispiel: Erstellen eines virtuellen Computers
- Verwenden verwalteter Azure-Datenträger mit den Azure-Bibliotheken (SDK) für Python
- Kurze Umfrage zum Azure SDK für Python