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 che verrà usato e salvato 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

Le due sezioni seguenti illustrano due modi per accedere al contenitore BLOB creato tramite Esempio: Creare Archiviazione di Azure.

Il primo metodo (con autenticazione) autentica l'app con DefaultAzureCredential come descritto in Autenticare le app Python nei servizi di Azure durante lo sviluppo locale usando le entità servizio. Con questo metodo, devi prima assegnare le autorizzazioni appropriate all'identità dell'app, che è la procedura consigliata.

Il secondo metodo (con stringa di connessione) usa un stringa di connessione per accedere direttamente all'account di archiviazione. Anche se questo metodo sembra più semplice, presenta due svantaggi significativi:

  • Una stringa di connessione autentica intrinsecamente l'agente di connessione con l'account di archiviazione invece che con le singole risorse al suo interno. Di conseguenza, un stringa di connessione concede un'autorizzazione più ampia di quanto potrebbe essere necessario.

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

Per questi motivi, per il codice di produzione è consigliabile usare il metodo di autenticazione.

4a: Usare l'archiviazione BLOB con l'autenticazione

  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": "00000000-0000-0000-0000-000000000000",
      "displayName": "{service-principal-name}",
      "password": "abcdefghijklmnopqrstuvwxyz",
      "tenant": "11111111-1111-1111-1111-111111111111"
    }
    

    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=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  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 di collaboratore per il 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 un nome errato, viene visualizzato il messaggio di errore "Non è possibile eseguire l'operazione richiesta su una risorsa annidata. 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.

4b: Usare l'archiviazione BLOB con un stringa di connessione

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

    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. Creare una variabile di ambiente denominata AZURE_STORAGE_CONNECTION_STRING, il cui valore è la stringa di connessione completa per l'account di archiviazione. Questa variabile di ambiente viene usata anche da vari commenti dell'interfaccia della riga di comando di Azure. È possibile ottenere il stringa di connessione per l'account di archiviazione eseguendo il comando az storage account show-connection-string.

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

    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.

    Quando si imposta la variabile di ambiente, usare l'intero valore della connectionString proprietà nell'output, incluse le virgolette.

  3. Eseguire il codice:

    python use_blob_conn_string.py
    

Anche in questo caso, sebbene il metodo sia semplice, una stringa di connessione autorizza tutte le operazioni in un account di archiviazione. Con il codice di produzione, è preferibile usare autorizzazioni specifiche, come descritto nella sezione precedente.

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'archiviazione BLOB con l'autenticazione, è possibile aggiungere il --connection-string parametro al comando precedente con il stringa di connessione per l'account di archiviazione. Per informazioni su come ottenere il stringa di connessione, vedere le istruzioni in 4b: Usare l'archiviazione BLOB con un stringa di connessione. Usare l'intero stringa di connessione incluse le virgolette.

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 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'archiviazione BLOB con l'autenticazione, è 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