Exempel: Få åtkomst till Azure Storage med hjälp av Azure-biblioteken för Python
I den här artikeln får du lära dig hur du använder Azure-klientbiblioteken i Python-programkoden för att ladda upp en fil till en Azure Blob Storage-container. Artikeln förutsätter att du har skapat de resurser som visas i Exempel: Skapa Azure Storage.
Alla kommandon i den här artikeln fungerar på samma sätt i Linux/macOS bash- och Windows-kommandogränssnitt om de inte anges.
1. Konfigurera din lokala utvecklingsmiljö
Om du inte redan har gjort det konfigurerar du en miljö där du kan köra den här koden. Här följer några alternativ:
Konfigurera en virtuell Python-miljö med hjälp av
venv
eller valfritt verktyg. Du kan skapa den virtuella miljön lokalt eller i Azure Cloud Shell och köra koden där. Var noga med att aktivera den virtuella miljön för att börja använda den.Använd en conda-miljö.
Använd en Dev-container i Visual Studio Code eller GitHub Codespaces.
2. Installera bibliotekspaket
I filen requirements.txt lägger du till rader för det klientbibliotekspaket som du behöver och sparar filen.
azure-storage-blob
azure-identity
Installera sedan kraven i terminalen eller kommandotolken.
pip install -r requirements.txt
3. Skapa en fil som ska laddas upp
Skapa en källfil med namnet sample-source.txt. Det här filnamnet är vad koden förväntar sig.
Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.
4. Använd bloblagring från appkod
Det här avsnittet visar två sätt att komma åt data i blobcontainern som du skapade i Exempel: Skapa Azure Storage. För att få åtkomst till data i blobcontainern måste din app kunna autentisera med Azure och ha behörighet att komma åt data i containern. I det här avsnittet beskrivs två sätt att göra detta:
Metoden Passwordless (rekommenderas) autentiserar appen med hjälp
DefaultAzureCredential
av .DefaultAzureCredential
är en länkad autentiseringsuppgift som kan autentisera en app (eller en användare) med hjälp av en sekvens med olika autentiseringsuppgifter, inklusive autentiseringsuppgifter för utvecklarverktyg, programtjänsthuvudnamn och hanterade identiteter.Metoden Anslutningssträng använder en anslutningssträng för att komma åt lagringskontot direkt.
Av följande skäl och mer rekommenderar vi att du använder den lösenordslösa metoden när det är möjligt:
En anslutningssträng autentiserar den anslutande agenten med lagringskontot i stället för med enskilda resurser i kontot. Därför ger en anslutningssträng bredare auktorisering än vad som kan behövas. Med
DefaultAzureCredential
kan du ge mer detaljerade, minst privilegierade behörigheter över dina lagringsresurser till den identitet som appen körs under med hjälp av Azure RBAC.En anslutningssträng innehåller åtkomstinformation i oformaterad text och presenterar därför potentiella sårbarheter om den inte är korrekt konstruerad eller skyddad. Om en sådan anslutningssträng exponeras kan den användas för att komma åt en mängd olika resurser i lagringskontot.
En anslutningssträng lagras vanligtvis i en miljövariabel, vilket gör den sårbar för intrång om en angripare får åtkomst till din miljö. Många av de typer av autentiseringsuppgifter som stöds av kräver inte lagring av
DefaultAzureCredential
hemligheter i din miljö.
DefaultAzureCredential
är en åsiktsförkonfigurerad kedja med autentiseringsuppgifter. Den är utformad för att stödja många miljöer, tillsammans med de vanligaste autentiseringsflödena och utvecklarverktygen. En instans av avgör vilka typer av DefaultAzureCredential
autentiseringsuppgifter som ska försöka hämta en token för baserat på en kombination av dess körningsmiljö, värdet för vissa välkända miljövariabler och, om du vill, parametrar som skickas till konstruktorn.
I följande steg konfigurerar du ett huvudnamn för programtjänsten som programidentitet. Programtjänstens huvudnamn är lämpliga för användning både under lokal utveckling och för appar som finns lokalt. Om du vill konfigurera DefaultAzureCredential
att använda programtjänstens huvudnamn anger du följande miljövariabler: AZURE_CLIENT_ID
, AZURE_TENANT_ID
och AZURE_CLIENT_SECRET
.
Observera att en klienthemlighet har konfigurerats. Detta är nödvändigt för ett huvudnamn för programtjänsten, men beroende på ditt scenario kan du även konfigurera DefaultAzureCredential
att använda autentiseringsuppgifter som inte kräver att du anger en hemlighet eller ett lösenord i en miljövariabel.
Om det till exempel DefaultAzureCredential
inte går att hämta en token med hjälp av konfigurerade miljövariabler försöker den få en med hjälp av användaren (redan) inloggad i utvecklingsverktyg som Azure CLI. För en app som finns i Azure DefaultAzureCredential
kan den konfigureras att använda en hanterad identitet. I samtliga fall förblir koden i din app densamma, endast konfigurationen och/eller körningsmiljön ändras.
Skapa en fil med namnet use_blob_auth.py med följande kod. Kommentarerna förklarar stegen.
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}")
Referenslänkar:
Skapa en miljövariabel med namnet
AZURE_STORAGE_BLOB_URL
:set AZURE_STORAGE_BLOB_URL=https://pythonazurestorage12345.blob.core.windows.net
Ersätt "pythonazurestorage12345" med namnet på ditt lagringskonto.
Miljövariabeln
AZURE_STORAGE_BLOB_URL
används endast i det här exemplet. Den används inte av Azure-biblioteken.Använd kommandot az ad sp create-for-rbac för att skapa ett nytt huvudnamn för tjänsten för appen. Kommandot skapar appregistreringen för appen samtidigt. Ge tjänstens huvudnamn ett valfritt namn.
az ad sp create-for-rbac --name <service-principal-name>
Utdata från det här kommandot ser ut så här. Anteckna dessa värden eller håll det här fönstret öppet eftersom du behöver dessa värden i nästa steg och inte kan visa lösenordet (klienthemlighet) igen. Du kan dock lägga till ett nytt lösenord senare utan att ogiltigförklara tjänstens huvudnamn eller befintliga lösenord om det behövs.
{ "appId": "00001111-aaaa-2222-bbbb-3333cccc4444", "displayName": "<service-principal-name>", "password": "Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2", "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee" }
Azure CLI-kommandon kan köras i Azure Cloud Shell eller på en arbetsstation med Azure CLI installerat.
Skapa miljövariabler för programtjänstens huvudnamn:
Skapa följande miljövariabler med värdena från utdata från föregående kommando. De här variablerna anger
DefaultAzureCredential
att programtjänstens huvudnamn ska användas.AZURE_CLIENT_ID
→ App-ID-värdet.AZURE_TENANT_ID
→ Klientorganisations-ID-värdet.AZURE_CLIENT_SECRET
→ Lösenordet/autentiseringsuppgifterna som genereras för appen.
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
Försök att köra koden (vilket misslyckas avsiktligt):
python use_blob_auth.py
Observera felet "Den här begäran har inte behörighet att utföra den här åtgärden med den här behörigheten." Felet förväntas eftersom det lokala tjänstens huvudnamn som du använder ännu inte har behörighet att komma åt blobcontainern.
Bevilja Storage Blob Data Contributor-behörigheter för blobcontainern till tjänstens huvudnamn med kommandot 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"
Argumentet
--assignee
identifierar tjänstens huvudnamn. Ersätt <AZURE_CLIENT_ID> platshållare med app-ID:t för tjänstens huvudnamn.Argumentet
--scope
identifierar var rolltilldelningen gäller. I det här exemplet beviljar du rollen "Storage Blob Data Contributor" till tjänstens huvudnamn för containern med namnet "blob-container-01".Ersätt
PythonAzureExample-Storage-rg
ochpythonazurestorage12345
med resursgruppen som innehåller ditt lagringskonto och det exakta namnet på ditt lagringskonto. Justera även namnet på blobcontainern om det behövs. Om du använder fel namn visas felet "Det går inte att utföra den begärda åtgärden på den kapslade resursen. Den överordnade resursen "pythonazurestorage12345" hittades inte."Ersätt AZURE_SUBSCRIPTION_ID <> platshållare med ditt Azure-prenumerations-ID. (Du kan köra kommandot az account show och hämta ditt prenumerations-ID från
id
egenskapen i utdata.)
Dricks
Om rolltilldelningskommandot returnerar felet "Inga anslutningskort hittades" när du använder Bash Shell kan du prova att ange
export MSYS_NO_PATHCONV=1
för att undvika sökvägsöversättning. Mer information finns i det här problemet.Vänta en minut eller två för att behörigheterna ska spridas och kör sedan koden igen för att kontrollera att den nu fungerar. Om du ser behörighetsfelet igen väntar du lite längre och försöker sedan med koden igen.
Mer information om rolltilldelningar finns i Tilldela rollbehörigheter med hjälp av Azure CLI.
Viktigt!
I föregående steg kördes appen under ett huvudnamn för programtjänsten. Ett huvudnamn för programtjänsten kräver en klienthemlighet i konfigurationen. Du kan dock använda samma kod för att köra appen under olika typer av autentiseringsuppgifter som inte kräver att du uttryckligen konfigurerar ett lösenord eller en hemlighet i miljön. Under utvecklingen DefaultAzureCredential
kan du till exempel använda autentiseringsuppgifter för utvecklarverktyg som de autentiseringsuppgifter som du använder för att logga in via Azure CLI, eller använda en hanterad identitet för appar som finns i Azure. Mer information finns i Autentisera Python-appar till Azure-tjänster med hjälp av Azure SDK för Python.
5. Kontrollera att bloben har skapats
När du har kört koden för någon av metoderna går du till Azure Portal, navigerar till blobcontainern för att kontrollera att det finns en ny blob med namnet sample-blob-{random}.txt med samma innehåll som filen sample-source.txt:
Om du har skapat en miljövariabel med namnet AZURE_STORAGE_CONNECTION_STRING
kan du också använda Azure CLI för att kontrollera att bloben finns med kommandot az storage blob list :
az storage blob list --container-name blob-container-01
Om du har följt anvisningarna för att använda lösenordslös autentisering kan du lägga till parametern --connection-string
i föregående kommando med anslutningssträng för ditt lagringskonto. Om du vill hämta anslutningssträng använder du kommandot az storage account show-connection-string.
az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345 --output tsv
Använd hela anslutningssträng som värde för parametern--connection-string
.
Kommentar
Om ditt Azure-användarkonto har rollen "Storage Blob Data Contributor" i containern kan du använda följande kommando för att visa blobarna i containern:
az storage blob list --container-name blob-container-01 --account-name pythonazurestorage12345 --auth-mode login
6. Rensa resurser
Kör kommandot az group delete om du inte behöver behålla resursgruppen och lagringsresurserna som används i det här exemplet. Resursgrupper debiteras inte några löpande avgifter i din prenumeration, men resurser, till exempel lagringskonton, i resursgruppen kan fortsätta att debiteras. Det är en bra idé att rensa alla grupper som du inte aktivt använder. Argumentet --no-wait
gör att kommandot kan returneras omedelbart i stället för att vänta på att åtgärden ska slutföras.
az group delete -n PythonAzureExample-Storage-rg --no-wait
Du kan också använda ResourceManagementClient.resource_groups.begin_delete
metoden för att ta bort en resursgrupp från koden. Koden i Exempel: Skapa en resursgrupp visar användning.
Om du har följt anvisningarna för att använda lösenordslös autentisering är det en bra idé att ta bort programtjänstens huvudnamn som du skapade. Du kan använda kommandot az ad app delete . Ersätt platshållaren <AZURE_CLIENT_ID> med app-ID:t för tjänstens huvudnamn.
az ad app delete --id <AZURE_CLIENT_ID>
Se även
- Snabbstart: Azure Blob Storage-klientbibliotek för Python
- Exempel: Skapa en resursgrupp
- Exempel: Lista resursgrupper i en prenumeration
- Exempel: Skapa en webbapp och distribuera kod
- Exempel: Skapa Azure Storage
- Exempel: Skapa och fråga en databas
- Exempel: Skapa en virtuell dator
- Använda Azure Managed Disks med virtuella datorer
- Slutför en kort undersökning om Azure SDK för Python