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:
Configurare un ambiente virtuale Python usando o lo
venv
strumento preferito. È possibile creare l'ambiente virtuale in locale o in Azure Cloud Shell ed eseguire il codice. Assicurarsi di attivare l'ambiente virtuale per iniziare a usarlo.Usare un ambiente conda.
Usare un contenitore di sviluppo in Visual Studio Code o GitHub Codespaces.
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
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:
Creare una variabile di ambiente denominata
AZURE_STORAGE_BLOB_URL
: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.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.
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.
Tentativo di eseguire il codice (che non riesce intenzionalmente):
python use_blob_auth.py
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.
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
epythonazurestorage12345
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.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
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}")
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
epythonazurestorage12345
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.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:
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
- Esempio: Creare un gruppo di risorse
- Esempio: Elencare i gruppi di risorse in una sottoscrizione
- Esempio: Creare un'app Web e distribuire il codice
- Esempio: Creare Archiviazione di Azure
- Esempio: Creare ed eseguire query su un database
- Esempio: Creare una macchina virtuale
- Usare Azure Managed Disks con le macchine virtuali
- Completare un breve sondaggio su Azure SDK per Python
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per