Delen via


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:

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

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

  2. Maak een omgevingsvariabele met de naam AZURE_STORAGE_BLOB_URL:

    set AZURE_STORAGE_BLOB_URL=https://pythonazurestorage12345.blob.core.windows.net
    

    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.

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

  4. 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.
    set AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  5. Probeer de code uit te voeren (die opzettelijk mislukt):

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

  7. 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 door PythonAzureExample-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.

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

  1. 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}")
    
  2. Maak een omgevingsvariabele met de naamAZURE_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 door PythonAzureExample-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.

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

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

Als u een omgevingsvariabele met de naam AZURE_STORAGE_CONNECTION_STRINGhebt 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