Condividi tramite


Esempio: Accesso ad Archiviazione di Azure utilizzando 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, aggiungi le righe per il pacchetto della libreria client necessario e salva 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

Crea 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. Utilizzare l'archiviazione BLOB dal codice dell'applicazione

Questa sezione illustra due modi per accedere ai dati nel contenitore blob che hai creato in Esempio: Creazione dell'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 degli strumenti di sviluppo, i principali del servizio dell'applicazione e le identità gestite.

  • Il metodo Stringa di connessione usa una stringa di connessione per accedere direttamente all'account di archivio.

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

  • Una 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 all'identità sotto cui viene eseguita l'app usando Azure RBAC.

  • 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 esposta, può essere usata per accedere a un'ampia gamma di risorse all'interno dell'account di archiviazione.

  • Una stringa di connessione viene in genere memorizzata in una variabile di ambiente, rendendola vulnerabile a compromissioni se un utente malintenzionato ottiene l'accesso all'ambiente. Molti dei tipi di credenziali supportati da non richiedono l'archiviazione dei segreti nell'ambiente in uso.

DefaultAzureCredential è una catena di credenziali preconfigurata e orientata. È 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 basato su una combinazione dell'ambiente di runtime, del valore di determinate variabili di ambiente note e, se necessario, dai parametri forniti al suo costruttore.

Nei passaggi seguenti viene configurata un'entità servizio dell'applicazione come identità dell'applicazione. I principali del servizio applicativo sono adatti per l'uso sia durante lo sviluppo locale che per le app ospitate in sede. 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 del client. Questa operazione è necessaria per un'entità servizio dell'applicazione, ma, a seconda dello scenario, è anche possibile configurare DefaultAzureCredential per usare 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 chiamata 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 variabile di ambiente AZURE_STORAGE_BLOB_URL 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 un nuovo principale del servizio per l'applicazione. Il comando crea simultaneamente la registrazione per l'app. Assegna all'entità servizio un nome a tua scelta.

    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 il principale del servizio applicativo:

    Creare le variabili di ambiente seguenti con i valori dell'output del comando precedente. Queste variabili indicano a DefaultAzureCredential di usare il principale del servizio dell'applicazione.

    • Il valore dell'ID dell'app.
    • Il valore dell'ID del tenant.
    • AZURE_CLIENT_SECRET → Password/credenziale generata per l'applicazione.
    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 fallisce intenzionalmente):

    python use_blob_auth.py
    
  6. Prendere nota dell'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 di 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 il principale del servizio. Sostituire <AZURE_CLIENT_ID> segnaposto con l'ID app del principale del servizio.

    L'argomento --scope identifica dove si applica questa assegnazione di ruolo. In questo esempio, si assegna il ruolo di "Storage Blob Data Contributor" 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 principale 'pythonazurestorage12345' non è stata trovata.

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

    Suggerimento

    Se il comando di assegnazione di ruolo restituisce l'errore "Nessun adattatore di connessione trovato" quando si utilizza la shell bash, provare a impostare `export MSYS_NO_PATHCONV=1` per evitare la traduzione del percorso. Per ulteriori informazioni, consultare questa segnalazione.

  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 sotto un principale del servizio applicativo. Un principale del servizio applicativo 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ò utilizzare le credenziali degli strumenti di sviluppo come quelle che usi per accedere tramite l'interfaccia della riga di comando di Azure. Oppure, per le app ospitate su Azure, può usare un'identità gestita. Per ulteriori informazioni, vedere Autenticare le app Python nei servizi di Azure usando Azure SDK per Python.

5. Verificare la creazione del 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:

Azure portal page for the blob container, showing the uploaded filePagina del portale di Azure relativa al contenitore BLOB che mostra il file caricato

Se hai creato una variabile di ambiente denominata AZURE_STORAGE_CONNECTION_STRING, puoi anche utilizzare 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 parametro --connection-string al comando precedente con la 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'intera stringa di connessione come valore per il parametro --connection-string.

Nota

Se l'account utente di Azure ha il ruolo di "Collaboratore dei dati di archiviazione BLOB" nel contenitore, è possibile usare il comando seguente per visualizzare 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 ripulire qualsiasi gruppo che non stai usando attivamente. L'argomento --no-wait consente al comando di restituire immediatamente il controllo invece di attendere il completamento dell'operazione.

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

È possibile utilizzare il metodo ResourceManagementClient.resource_groups.begin_delete per eliminare un gruppo di risorse dal codice. 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 utilizzare il comando az ad app delete. Sostituire il segnaposto <AZURE_CLIENT_ID> con l'ID app del principale del servizio.

az ad app delete --id <AZURE_CLIENT_ID>

Vedi anche