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 nodig hebt 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. Maak een bestand 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 deze sectie ziet u twee manieren om toegang te krijgen tot gegevens in de blobcontainer die u in het voorbeeld hebt gemaakt: Azure Storage maken. Als u toegang wilt krijgen tot gegevens in de blobcontainer, moet uw app zich kunnen verifiëren met Azure en gemachtigd zijn om toegang te krijgen tot gegevens in de container. In deze sectie worden twee manieren beschreven om dit te doen:

  • De methode Wachtwoordloos (Aanbevolen) verifieert de app met behulp van DefaultAzureCredential. DefaultAzureCredential is een gekoppelde referentie die een app (of een gebruiker) kan verifiëren met behulp van een reeks verschillende referenties, waaronder referenties voor ontwikkelaarshulpprogramma's, toepassingsservice-principals en beheerde identiteiten.

  • De methode Verbindingsreeks maakt gebruik van een verbindingsreeks om rechtstreeks toegang te krijgen tot het opslagaccount.

Om de volgende redenen en meer raden we u aan om waar mogelijk de methode zonder wachtwoord te gebruiken:

  • Een verbindingsreeks verifieert 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. Nu DefaultAzureCredential u gedetailleerdere, minst bevoegde machtigingen voor uw opslagresources kunt verlenen aan de identiteit die uw app uitvoert met behulp van Azure RBAC.

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

  • Een verbindingsreeks wordt meestal opgeslagen in een omgevingsvariabele, waardoor deze kwetsbaar is voor inbreuk als een aanvaller toegang krijgt tot uw omgeving. Veel van de referentietypen die worden ondersteund door DefaultAzureCredential , hoeven geen geheimen in uw omgeving op te slaan.

DefaultAzureCredential is een vooraf geconfigureerde keten van referenties. Het is ontworpen om veel omgevingen te ondersteunen, samen met de meest voorkomende verificatiestromen en ontwikkelhulpprogramma's. Een exemplaar van DefaultAzureCredential bepaalt voor welke referentietypen een token moet worden opgehaald op basis van een combinatie van de runtime-omgeving, de waarde van bepaalde bekende omgevingsvariabelen en, optioneel, parameters die zijn doorgegeven aan de constructor.

In de volgende stappen configureert u een toepassingsservice-principal als de toepassingsidentiteit. Toepassingsservice-principals zijn geschikt voor gebruik tijdens lokale ontwikkeling en voor apps die on-premises worden gehost. Als u wilt configureren DefaultAzureCredential voor het gebruik van de service-principal van de toepassing, stelt u de volgende omgevingsvariabelen in: AZURE_CLIENT_ID, AZURE_TENANT_IDen AZURE_CLIENT_SECRET.

U ziet dat een clientgeheim is geconfigureerd. Dit is nodig voor een service-principal van een toepassing, maar, afhankelijk van uw scenario, kunt u ook configureren DefaultAzureCredential voor het gebruik van referenties waarvoor geen geheim of wachtwoord is vereist in een omgevingsvariabele.

Als in lokale ontwikkeling DefaultAzureCredential bijvoorbeeld geen token kan worden opgehaald met behulp van geconfigureerde omgevingsvariabelen, wordt er een opgehaald met behulp van de gebruiker (al) aangemeld bij ontwikkelhulpprogramma's zoals Azure CLI. Voor een app die wordt gehost in Azure, DefaultAzureCredential kan deze worden geconfigureerd voor het gebruik van een beheerde identiteit. In alle gevallen blijft de code in uw app hetzelfde, alleen de configuratie en/of de runtime-omgeving verandert.

  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": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "displayName": "<service-principal-name>",
      "password": "Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2",
      "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
    }
    

    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=00001111-aaaa-2222-bbbb-3333cccc4444
    set AZURE_TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee
    set AZURE_CLIENT_SECRET=Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2
    
  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 opslagblobgegevens 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 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.

Belangrijk

In de voorgaande stappen is uw app uitgevoerd onder een toepassingsservice-principal. Een toepassingsservice-principal vereist een clientgeheim in de configuratie. U kunt echter dezelfde code gebruiken om de app uit te voeren onder verschillende referentietypen waarvoor u niet expliciet een wachtwoord of geheim in de omgeving hoeft te configureren. Tijdens de ontwikkeling DefaultAzureCredential kunt u bijvoorbeeld referenties voor ontwikkelaarshulpprogramma's gebruiken, zoals de referenties die u gebruikt om u aan te melden via de Azure CLI, of voor apps die worden gehost in Azure, een beheerde identiteit gebruiken. Zie Python-apps verifiëren voor Azure-services met behulp van de Azure SDK voor Python voor meer informatie.

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-pagina voor de blobcontainer, met het geüploade bestand

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 verificatie zonder wachtwoord hebt gevolgd, kunt u de --connection-string parameter toevoegen aan de voorgaande opdracht met de verbindingsreeks voor uw opslagaccount. Gebruik de opdracht az storage account show-connection-string om de verbindingsreeks op te halen.

az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345 --output tsv

Gebruik de volledige verbindingsreeks als de waarde voor de --connection-string parameter.

Notitie

Als uw Azure-gebruikersaccount de rol 'Inzender voor opslagblobgegevens' in de container heeft, kunt u de volgende opdracht gebruiken om de blobs in de container weer te geven:

az storage blob list --container-name blob-container-01 --account-name pythonazurestorage12345 --auth-mode login

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 doorlopende kosten in uw abonnement in rekening gebracht, maar resources, zoals opslagaccounts, in de resourcegroep worden mogelijk nog steeds 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 verificatie zonder wachtwoord 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