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

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

  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=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  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 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 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.

4b: Använda bloblagring med en anslutningssträng

  1. 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}")
    
  2. 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 och pythonazurestorage12345 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.

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

Azure portal page for the blob container, showing the uploaded file

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