Dela via


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:

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 DefaultAzureCredentialav . 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_IDoch 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.

  1. 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:

  2. 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.

  3. 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.

  4. 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
    
  5. Försök att köra koden (vilket misslyckas avsiktligt):

    python use_blob_auth.py
    
  6. 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.

  7. 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 och pythonazurestorage12345 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.

  8. 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:

Azure Portal sida för blobcontainern som visar den uppladdade filen

Om du har skapat en miljövariabel med namnet AZURE_STORAGE_CONNECTION_STRINGkan 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