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ö. 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 ska använda 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ända bloblagring från appkod
Följande två avsnitt visar två sätt att komma åt blobcontainern som skapats via Exempel: Skapa Azure Storage.
Den första metoden (med autentisering) autentiserar appen med DefaultAzureCredential
enligt beskrivningen i Autentisera Python-appar till Azure-tjänster under lokal utveckling med hjälp av tjänstens huvudnamn. Med den här metoden måste du först tilldela rätt behörigheter till appidentiteten, vilket är den rekommenderade metoden.
Den andra metoden (med anslutningssträng) använder en anslutningssträng för att komma åt lagringskontot direkt. Även om den här metoden verkar enklare har den två betydande nackdelar:
En anslutningssträng autentiserar den anslutande agenten med lagringskontot i stället för med enskilda resurser i det kontot. Därför ger en anslutningssträng bredare auktorisering än vad som kan behövas.
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.
Därför rekommenderar vi att du använder autentiseringsmetoden i produktionskoden.
4a: Använda bloblagring med autentisering
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
: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": "00000000-0000-0000-0000-000000000000", "displayName": "{service-principal-name}", "password": "abcdefghijklmnopqrstuvwxyz", "tenant": "11111111-1111-1111-1111-111111111111" }
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.
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 deltagarbehö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.
4b: Använda bloblagring med en anslutningssträng
Skapa en Python-fil med namnet use_blob_conn_string.py med följande kod. Kommentarerna förklarar stegen.
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}")
Skapa en miljövariabel med namnet
AZURE_STORAGE_CONNECTION_STRING
, vars värde är den fullständiga anslutningssträng för lagringskontot. (Den här miljövariabeln används också av olika Azure CLI-kommentarer.) Du kan hämta anslutningssträng för ditt lagringskonto genom att köra kommandot az storage account show-connection-string.az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345
Ersätt
PythonAzureExample-Storage-rg
ochpythonazurestorage12345
med resursgruppen som innehåller ditt lagringskonto och det exakta namnet på ditt lagringskonto.När du anger miljövariabeln använder du hela värdet för
connectionString
egenskapen i utdata inklusive citattecken.Kör koden:
python use_blob_conn_string.py
Även om den här metoden är enkel auktoriserar en anslutningssträng alla åtgärder i ett lagringskonto. Med produktionskod är det bättre att använda specifika behörigheter enligt beskrivningen i föregående avsnitt.
5. Kontrollera att bloben har skapats
När du har kört koden för någon av metoderna går du till Azure-portalen, 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 följde anvisningarna för att använda bloblagring med autentisering kan du lägga till parametern --connection-string
i föregående kommando med anslutningssträng för ditt lagringskonto. Information om hur du hämtar anslutningssträng finns i anvisningarna i 4b: Använda bloblagring med en anslutningssträng. Använd hela anslutningssträng inklusive citattecken.
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 medför inga löpande avgifter i din prenumeration, men resurser, till exempel lagringskonton, i resursgruppen kan medföra avgifter. 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 följde anvisningarna för att använda bloblagring med 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
- 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
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för