Voorbeeld: Toegang tot Azure Storage met behulp van de Azure-bibliotheken voor Python
In dit artikel leert u hoe u de Azure-clientbibliotheken in Python-toepassingscode gebruikt om een bestand te uploaden naar een Azure Blob Storage-container. In het artikel wordt ervan uitgegaan dat u de resources hebt gemaakt die worden weergegeven in voorbeeld: Azure Storage maken.
Alle opdrachten in dit artikel werken hetzelfde in Linux-/macOS-bash- en Windows-opdrachtshells, tenzij vermeld.
1: Uw lokale ontwikkelomgeving instellen
Als u dit nog niet hebt gedaan, stelt u een omgeving in waarin u deze code kunt uitvoeren. Hieronder volgen een aantal opties:
Een virtuele Python-omgeving configureren. U kunt de virtuele omgeving lokaal of in Azure Cloud Shell maken en daar de code uitvoeren. Zorg ervoor dat u de virtuele omgeving activeert om deze te gaan gebruiken.
Gebruik een Conda-omgeving.
Gebruik een Dev-container in Visual Studio Code of GitHub Codespaces.
2: Bibliotheekpakketten installeren
Voeg in het requirements.txt-bestand regels toe voor het clientbibliotheekpakket dat u gaat gebruiken en sla het bestand op.
azure-storage-blob
azure-identity
Installeer vervolgens de vereisten in de terminal of opdrachtprompt.
pip install -r requirements.txt
3: Een bestand maken om te uploaden
Maak een bronbestand met de naam sample-source.txt. Deze bestandsnaam is wat de code verwacht.
Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.
4: Blob Storage gebruiken vanuit app-code
In de volgende twee secties ziet u twee manieren om toegang te krijgen tot de blobcontainer die is gemaakt via voorbeeld: Azure Storage maken.
De eerste methode (met verificatie) verifieert de app met DefaultAzureCredential
zoals beschreven in Python-apps verifiëren bij Azure-services tijdens lokale ontwikkeling met behulp van service-principals. Met deze methode moet u eerst de juiste machtigingen toewijzen aan de app-identiteit. Dit is de aanbevolen procedure.
De tweede methode (met verbindingsreeks) gebruikt een verbindingsreeks om rechtstreeks toegang te krijgen tot het opslagaccount. Hoewel deze methode eenvoudiger lijkt, heeft deze twee belangrijke nadelen:
Een verbindingsreeks verifieert inherent de verbindingsagent met het opslagaccount in plaats van met afzonderlijke resources binnen dat account. Als gevolg hiervan verleent een verbindingsreeks bredere autorisatie dan nodig is.
Een verbindingsreeks bevat toegangsgegevens in tekst zonder opmaak en biedt daarom potentiële beveiligingsproblemen als deze niet goed zijn samengesteld of beveiligd. Als een dergelijk verbindingsreeks beschikbaar wordt gesteld, kan deze worden gebruikt voor toegang tot een breed scala aan resources binnen het opslagaccount.
Daarom raden we u aan de verificatiemethode in productiecode te gebruiken.
4a: Blob Storage gebruiken met verificatie
Maak een bestand met de naam use_blob_auth.py met de volgende code. In de opmerkingen worden de stappen uitgelegd.
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}")
Naslagkoppelingen:
Maak een omgevingsvariabele met de naam
AZURE_STORAGE_BLOB_URL
:Vervang 'pythonazurestorage12345' door de naam van uw opslagaccount.
De
AZURE_STORAGE_BLOB_URL
omgevingsvariabele wordt alleen in dit voorbeeld gebruikt. Het wordt niet gebruikt door de Azure-bibliotheken.Gebruik de opdracht az ad sp create-for-rbac om een nieuwe service-principal voor de app te maken. Met de opdracht maakt u tegelijkertijd de app-registratie voor de app. Geef de service-principal een naam van uw keuze.
az ad sp create-for-rbac --name {service-principal-name}
De uitvoer van deze opdracht ziet er als volgt uit. Noteer deze waarden of houd dit venster open omdat u deze waarden in de volgende stap nodig hebt en de waarde voor het wachtwoord (clientgeheim) niet opnieuw kunt weergeven. U kunt echter later een nieuw wachtwoord toevoegen zonder de service-principal of bestaande wachtwoorden indien nodig ongeldig te maken.
{ "appId": "00000000-0000-0000-0000-000000000000", "displayName": "{service-principal-name}", "password": "abcdefghijklmnopqrstuvwxyz", "tenant": "11111111-1111-1111-1111-111111111111" }
Azure CLI-opdrachten kunnen worden uitgevoerd in Azure Cloud Shell of op een werkstation waarop de Azure CLI is geïnstalleerd.
Omgevingsvariabelen maken voor de service-principal van de toepassing:
Maak de volgende omgevingsvariabelen met de waarden uit de uitvoer van de vorige opdracht. Deze variabelen geven aan
DefaultAzureCredential
dat u de service-principal van de toepassing moet gebruiken.AZURE_CLIENT_ID
→ de waarde van de app-id.AZURE_TENANT_ID
→ de waarde van de tenant-id.AZURE_CLIENT_SECRET
→ het wachtwoord/de referentie die voor de app is gegenereerd.
Probeer de code uit te voeren (die opzettelijk mislukt):
python use_blob_auth.py
Bekijk de fout 'Deze aanvraag is niet gemachtigd om deze bewerking uit te voeren met behulp van deze machtiging'. De fout wordt verwacht omdat de lokale service-principal die u gebruikt nog geen machtiging heeft voor toegang tot de blobcontainer.
Verdeel inzendermachtigingen voor de blobcontainer aan de service-principal met behulp van de opdracht 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"
Het
--assignee
argument identificeert de service-principal. Vervang <AZURE_CLIENT_ID> tijdelijke aanduiding door de app-id van uw service-principal.Het
--scope
argument geeft aan waar deze roltoewijzing van toepassing is. In dit voorbeeld verleent u de rol 'Inzender voor opslagblobgegevens' aan de service-principal voor de container met de naam 'blob-container-01'.Vervang en
pythonazurestorage12345
doorPythonAzureExample-Storage-rg
de resourcegroep die uw opslagaccount bevat en de exacte naam van uw opslagaccount. Pas indien nodig ook de naam van de blobcontainer aan. Als u de verkeerde naam gebruikt, ziet u de fout 'Kan de aangevraagde bewerking niet uitvoeren op geneste resource. Bovenliggende resource 'pythonazurestorage12345' is niet gevonden.Vervang de <AZURE_SUBSCRIPTION_ID> tijdelijke aanduiding door uw Azure-abonnements-id. (U kunt de opdracht az account show uitvoeren en uw abonnements-id ophalen uit de
id
eigenschap in de uitvoer.)
Tip
Als de opdracht voor roltoewijzing de fout 'Er zijn geen verbindingsadapters gevonden' retourneert bij het gebruik van bash-shell, probeert u de instelling in te stellen
export MSYS_NO_PATHCONV=1
om padomzetting te voorkomen. Zie dit probleem voor meer informatie.Wacht enkele minuten totdat de machtigingen zijn doorgegeven en voer de code opnieuw uit om te controleren of deze nu werkt. Als u de machtigingsfout opnieuw ziet, wacht u iets langer en probeert u de code opnieuw.
Zie Rolmachtigingen toewijzen met behulp van de Azure CLI voor meer informatie over roltoewijzingen.
4b: Blob-opslag gebruiken met een verbindingsreeks
Maak een Python-bestand met de naam use_blob_conn_string.py met de volgende code. In de opmerkingen worden de stappen uitgelegd.
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}")
Maak een omgevingsvariabele met de naam
AZURE_STORAGE_CONNECTION_STRING
, waarvan de waarde de volledige verbindingsreeks voor het opslagaccount is. (Deze omgevingsvariabele wordt ook gebruikt door verschillende Azure CLI-opmerkingen.) U kunt de verbindingsreeks voor uw opslagaccount ophalen door de opdracht az storage account show-connection-string uit te voeren.az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345
Vervang en
pythonazurestorage12345
doorPythonAzureExample-Storage-rg
de resourcegroep die uw opslagaccount bevat en de exacte naam van uw opslagaccount.Wanneer u de omgevingsvariabele instelt, gebruikt u de volledige waarde van de
connectionString
eigenschap in de uitvoer, inclusief de aanhalingstekens.Voer de code uit:
python use_blob_conn_string.py
Hoewel deze methode eenvoudig is, autoriseert een verbindingsreeks alle bewerkingen in een opslagaccount autoriseren. Met productiecode is het beter om specifieke machtigingen te gebruiken, zoals beschreven in de vorige sectie.
5. Het maken van een blob controleren
Nadat u de code van een van beide methoden hebt uitgevoerd, gaat u naar Azure Portal en gaat u naar de blobcontainer om te controleren of er een nieuwe blob bestaat met de naam sample-blob-{random}.txt met dezelfde inhoud als het sample-source.txt bestand:
Als u een omgevingsvariabele met de naam AZURE_STORAGE_CONNECTION_STRING
hebt gemaakt, kunt u ook de Azure CLI gebruiken om te controleren of de blob bestaat met behulp van de opdracht az storage blob list :
az storage blob list --container-name blob-container-01
Als u de instructies voor het gebruik van blobopslag met verificatie hebt gevolgd, kunt u de --connection-string
parameter toevoegen aan de voorgaande opdracht met de verbindingsreeks voor uw opslagaccount. Zie de instructies in 4b: Blob Storage gebruiken met een verbindingsreeks voor meer informatie over het verkrijgen van de verbindingsreeks. Gebruik de hele verbindingsreeks inclusief de aanhalingstekens.
6: Resources opschonen
Voer de opdracht az group delete uit als u de resourcegroep en opslagresources die in dit voorbeeld worden gebruikt, niet hoeft te behouden. Voor resourcegroepen worden geen lopende kosten in uw abonnement in rekening gebracht, maar voor resources, zoals opslagaccounts, in de resourcegroep worden mogelijk kosten in rekening gebracht. Het is een goede gewoonte om een groep op te schonen die u niet actief gebruikt. Met --no-wait
het argument kan de opdracht onmiddellijk worden geretourneerd in plaats van te wachten tot de bewerking is voltooid.
az group delete -n PythonAzureExample-Storage-rg --no-wait
U kunt ook de ResourceManagementClient.resource_groups.begin_delete
methode gebruiken om een resourcegroep uit code te verwijderen. De code in voorbeeld: Een resourcegroep maken laat het gebruik zien.
Als u de instructies voor het gebruik van blobopslag met verificatie hebt gevolgd, is het een goed idee om de service-principal van de toepassing te verwijderen die u hebt gemaakt. U kunt de opdracht az ad app delete gebruiken. Vervang de <tijdelijke aanduiding AZURE_CLIENT_ID> door de app-id van uw service-principal.
az ad app delete --id <AZURE_CLIENT_ID>
Zie ook
- Voorbeeld: Een resourcegroep maken
- Voorbeeld: Resourcegroepen weergeven in een abonnement
- Voorbeeld: Een web-app maken en code implementeren
- Voorbeeld: Azure Storage maken
- Voorbeeld: Een database maken en er query's op uitvoeren
- Voorbeeld: Een virtuele machine maken
- Azure Managed Disks gebruiken met virtuele machines
- Een korte enquête over de Azure SDK voor Python voltooien
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor