Condividi tramite


Esempio: Accedere Archiviazione di Azure usando le librerie di Azure per Python

Questo articolo illustra come usare le librerie client di Azure nel codice dell'applicazione Python per caricare un file in un contenitore di archiviazione BLOB di Azure. L'articolo presuppone che siano state create le risorse illustrate in Esempio: Creare Archiviazione di Azure.

Se non diversamente specificato, tutti i comandi di questo articolo funzionano allo stesso modo nella shell Bash Linux/macOS e nella shell dei comandi di Windows.

1. Configurare l'ambiente di sviluppo locale

Se non è già stato fatto, configurare un ambiente in cui è possibile eseguire questo codice. Di seguito sono riportate alcuni opzioni:

2. Installare i pacchetti di libreria

Nel file requirements.txt aggiungere righe per il pacchetto della libreria client necessario e salvare il file.

azure-storage-blob
azure-identity

Quindi, nel terminale o nel prompt dei comandi, installare i requisiti.

pip install -r requirements.txt

3. Creare un file da caricare

Creare un file di origine denominato sample-source.txt. Questo nome file è quello previsto dal codice.

Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.

4. Usare l'archiviazione BLOB dal codice dell'app

Questa sezione illustra due modi per accedere ai dati nel contenitore BLOB creato in Esempio: Creare Archiviazione di Azure. Per accedere ai dati nel contenitore BLOB, l'app deve essere in grado di eseguire l'autenticazione con Azure ed essere autorizzata ad accedere ai dati nel contenitore. Questa sezione presenta due modi per eseguire questa operazione:

  • Il metodo Senza password (scelta consigliata) autentica l'app usando DefaultAzureCredential. DefaultAzureCredential è una credenziale concatenata che può autenticare un'app (o un utente) usando una sequenza di credenziali diverse, incluse le credenziali dello strumento di sviluppo, le entità servizio dell'applicazione e le identità gestite.

  • Il metodo Stringa di connessione usa un stringa di connessione per accedere direttamente all'account di archiviazione.

Per i motivi seguenti e altro ancora, è consigliabile usare il metodo senza password quando possibile:

  • Un stringa di connessione autentica l'agente di connessione con l'account di archiviazione anziché con le singole risorse all'interno di tale account. Di conseguenza, un stringa di connessione concede un'autorizzazione più ampia di quanto potrebbe essere necessario. Con DefaultAzureCredential è possibile concedere autorizzazioni più granulari e con privilegi minimi sulle risorse di archiviazione per l'identità eseguita dall'app usando il controllo degli accessi in base al ruolo di Azure.

  • Un stringa di connessione contiene informazioni di accesso in testo normale e pertanto presenta potenziali vulnerabilità se non è costruito o protetto correttamente. Se tale stringa di connessione viene esposto, può essere usato per accedere a un'ampia gamma di risorse all'interno dell'account di archiviazione.

  • Un stringa di connessione viene in genere archiviato in una variabile di ambiente, che rende vulnerabile la compromissione se un utente malintenzionato ottiene l'accesso all'ambiente. Molti dei tipi di credenziali supportati da DefaultAzureCredential non richiedono l'archiviazione dei segreti nell'ambiente in uso.

DefaultAzureCredential è una catena di credenziali preconfigurata e opinionata. È progettata per supportare molti ambienti, insieme ai flussi di autenticazione e agli strumenti di sviluppo più comuni. Un'istanza di DefaultAzureCredential determina quali tipi di credenziali provare a ottenere un token per in base a una combinazione dell'ambiente di runtime, al valore di determinate variabili di ambiente note e, facoltativamente, ai parametri passati nel relativo costruttore.

Nei passaggi seguenti viene configurata un'entità servizio dell'applicazione come identità dell'applicazione. Le entità servizio dell'applicazione sono adatte per l'uso sia durante lo sviluppo locale che per le app ospitate in locale. Per configurare DefaultAzureCredential l'uso dell'entità servizio dell'applicazione, impostare le variabili di ambiente seguenti: AZURE_CLIENT_ID, AZURE_TENANT_IDe AZURE_CLIENT_SECRET.

Si noti che è configurato un segreto client. Questa operazione è necessaria per un'entità servizio dell'applicazione, ma, a seconda dello scenario, è anche possibile configurare DefaultAzureCredential per usare le credenziali che non richiedono l'impostazione di un segreto o una password in una variabile di ambiente.

Ad esempio, nello sviluppo locale, se DefaultAzureCredential non è possibile ottenere un token usando le variabili di ambiente configurate, prova a ottenerlo usando l'utente (già) connesso agli strumenti di sviluppo come l'interfaccia della riga di comando di Azure. Per un'app ospitata in Azure, DefaultAzureCredential può essere configurata per l'uso di un'identità gestita. In tutti i casi, il codice nell'app rimane invariato, solo la configurazione e/o l'ambiente di runtime cambia.

  1. Creare un file denominato use_blob_auth.py con il codice seguente. I commenti spiegano i passaggi.

    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}")
    

    Collegamenti di riferimento:

  2. Creare una variabile di ambiente denominata AZURE_STORAGE_BLOB_URL:

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

    Sostituire "pythonazurestorage12345" con il nome dell'account di archiviazione.

    La AZURE_STORAGE_BLOB_URL variabile di ambiente viene usata solo da questo esempio. Non viene usato dalle librerie di Azure.

  3. Usare il comando az ad sp create-for-rbac per creare una nuova entità servizio per l'app. Il comando crea contemporaneamente la registrazione dell'app per l'app. Assegnare all'entità servizio un nome scelto.

    az ad sp create-for-rbac --name <service-principal-name>
    

    L'output di questo comando sarà simile al seguente. Prendere nota di questi valori o mantenere aperta questa finestra perché saranno necessari questi valori nel passaggio successivo e non sarà più in grado di visualizzare di nuovo il valore della password (segreto client). È tuttavia possibile aggiungere una nuova password in un secondo momento senza invalidare l'entità servizio o le password esistenti, se necessario.

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

    I comandi dell'interfaccia della riga di comando di Azure possono essere eseguiti in Azure Cloud Shell o in una workstation con l'interfaccia della riga di comando di Azure installata.

  4. Creare variabili di ambiente per l'entità servizio dell'applicazione:

    Creare le variabili di ambiente seguenti con i valori dell'output del comando precedente. Queste variabili indicano di DefaultAzureCredential usare l'entità servizio dell'applicazione.

    • AZURE_CLIENT_ID → Il valore dell'ID dell'app.
    • AZURE_TENANT_ID → Il valore dell'ID del tenant.
    • AZURE_CLIENT_SECRET → Password/credenziali generate per l'app.
    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. Tentativo di eseguire il codice (che non riesce intenzionalmente):

    python use_blob_auth.py
    
  6. Osservare l'errore "Questa richiesta non è autorizzata a eseguire questa operazione usando questa autorizzazione". L'errore è previsto perché l'entità servizio locale in uso non dispone ancora dell'autorizzazione per accedere al contenitore BLOB.

  7. Concedere le autorizzazioni collaboratore ai dati dei BLOB di archiviazione nel contenitore BLOB all'entità servizio usando il comando az role assignment create dell'interfaccia della riga di comando di Azure:

    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"
    

    L'argomento --assignee identifica l'entità servizio. Sostituire <AZURE_CLIENT_ID> segnaposto con l'ID app dell'entità servizio.

    L'argomento --scope identifica dove viene applicata questa assegnazione di ruolo. In questo esempio si concede il ruolo "Collaboratore dati BLOB di archiviazione" all'entità servizio per il contenitore denominato "blob-container-01".

    • Sostituire PythonAzureExample-Storage-rg e pythonazurestorage12345 con il gruppo di risorse che contiene l'account di archiviazione e il nome esatto dell'account di archiviazione. Inoltre, modificare il nome del contenitore BLOB, se necessario. Se si usa il nome errato, viene visualizzato l'errore "Impossibile eseguire l'operazione richiesta sulla risorsa nidificata. La risorsa padre 'pythonazurestorage12345' non è stata trovata".

    • Sostituire il <segnaposto AZURE_SUBSCRIPTION_ID> con l'ID sottoscrizione di Azure. È possibile eseguire il comando az account show e ottenere l'ID id sottoscrizione dalla proprietà nell'output.

    Suggerimento

    Se il comando di assegnazione di ruolo restituisce un errore "Nessun adattatore di connessione trovato" quando si usa la shell bash, provare a impostare export MSYS_NO_PATHCONV=1 per evitare la conversione del percorso. Per altre informazioni, vedere questo problema.

  8. Attendere un minuto o due affinché le autorizzazioni vengano propagate, quindi eseguire di nuovo il codice per verificare che funzioni. Se l'errore delle autorizzazioni persiste, attendere un po' più a lungo, quindi riprovare a eseguire il codice.

Per altre informazioni sulle assegnazioni di ruolo, vedere Come assegnare le autorizzazioni per i ruoli con l'interfaccia della riga di comando di Azure.

Importante

Nei passaggi precedenti l'app è stata eseguita con un'entità servizio dell'applicazione. Un'entità servizio dell'applicazione richiede un segreto client nella configurazione. È tuttavia possibile usare lo stesso codice per eseguire l'app con tipi di credenziali diversi che non richiedono di configurare in modo esplicito una password o un segreto nell'ambiente. Ad esempio, durante lo sviluppo, DefaultAzureCredential può usare credenziali dello strumento di sviluppo come le credenziali usate per accedere tramite l'interfaccia della riga di comando di Azure oppure, per le app ospitate in Azure, può usare un'identità gestita. Per altre informazioni, vedere Autenticare le app Python nei servizi di Azure usando Azure SDK per Python.

5. Verificare la creazione di BLOB

Dopo aver eseguito il codice di uno dei due metodi, passare al portale di Azure, passare al contenitore BLOB per verificare che esista un nuovo BLOB denominato sample-blob-{random}.txt con lo stesso contenuto del file sample-source.txt:

Pagina del portale di Azure relativa al contenitore BLOB che mostra il file caricato

Se è stata creata una variabile di ambiente denominata AZURE_STORAGE_CONNECTION_STRING, è anche possibile usare l'interfaccia della riga di comando di Azure per verificare che il BLOB esista usando il comando az storage BLOB list :

az storage blob list --container-name blob-container-01

Se sono state seguite le istruzioni per usare l'autenticazione senza password, è possibile aggiungere il --connection-string parametro al comando precedente con il stringa di connessione per l'account di archiviazione. Per ottenere il stringa di connessione, usare il comando az storage account show-connection-string.

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

Usare l'intero stringa di connessione come valore per il --connection-string parametro .

Nota

Se l'account utente di Azure ha il ruolo "Collaboratore dati BLOB di archiviazione" nel contenitore, è possibile usare il comando seguente per elencare i BLOB nel contenitore:

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

6. Pulire le risorse

Eseguire il comando az group delete se non è necessario mantenere il gruppo di risorse e le risorse di archiviazione usate in questo esempio. I gruppi di risorse non comportano addebiti in corso nella sottoscrizione, ma le risorse, come gli account di archiviazione, nel gruppo di risorse potrebbero continuare a comportare addebiti. È consigliabile pulire qualsiasi gruppo che non si usa attivamente. Con l'argomento --no-wait, il comando restituisce immediatamente il risultato invece di attendere il completamento dell'operazione.

az group delete -n PythonAzureExample-Storage-rg  --no-wait

Per eliminare un gruppo di risorse dal codice, è anche possibile usare il metodo ResourceManagementClient.resource_groups.begin_delete. Il codice in Esempio: Creare un gruppo di risorse illustra l'utilizzo.

Se sono state seguite le istruzioni per usare l'autenticazione senza password, è consigliabile eliminare l'entità servizio dell'applicazione creata. È possibile usare il comando az ad app delete . Sostituire il <segnaposto AZURE_CLIENT_ID> con l'ID app dell'entità servizio.

az ad app delete --id <AZURE_CLIENT_ID>

Vedi anche