Condividi tramite


Creare e distribuire un'app Web Python Flask in Azure con identità gestita assegnata dal sistema

In questa esercitazione si distribuisce il codice Python Flask per creare e distribuire un'app Web in esecuzione nel servizio app Azure. L'app Web usa l'identità gestita assegnata dal sistema (connessioni senza password) con il controllo degli accessi in base al ruolo di Azure per accedere Archiviazione di Azure e Database di Azure per PostgreSQL - Risorse server flessibili. Il codice usa la classe DefaultAzureCredential della libreria client di Azure Identity per Python. La DefaultAzureCredential classe rileva automaticamente che esiste un'identità gestita per il servizio app e la usa per accedere ad altre risorse di Azure.

È possibile configurare connessioni senza password ai servizi di Azure usando Service Connector oppure configurarle manualmente. Questa esercitazione illustra come usare Service Connector. Per altre informazioni sulle connessioni senza password, vedere Connessioni senza password per i servizi di Azure. Per informazioni su Service Connector, vedere la documentazione di Service Connector.

Questa esercitazione illustra come creare e distribuire un'app Web Python usando l'interfaccia della riga di comando di Azure. I comandi in questa esercitazione vengono scritti per l'esecuzione in una shell Bash. È possibile eseguire i comandi dell'esercitazione in qualsiasi ambiente Bash con l'interfaccia della riga di comando installata, ad esempio l'ambiente locale o Azure Cloud Shell. Con alcune modifiche, ad esempio l'impostazione e l'uso delle variabili di ambiente, è possibile eseguire questi comandi in altri ambienti, ad esempio la shell dei comandi di Windows. Per esempi di uso di un'identità gestita assegnata dall'utente, vedere Creare e distribuire un'app Web Django in Azure con un'identità gestita assegnata dall'utente.

Ottenere l'app di esempio

È disponibile un'applicazione Python di esempio che usa il framework Flask per seguire questa esercitazione. Scaricare o clonare una delle applicazioni di esempio nella workstation locale.

  1. Clonare l'esempio in una sessione di Azure Cloud Shell.

    git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.git
    
  2. Passare alla cartella dell'applicazione.

    cd msdocs-flask-web-app-managed-identity
    

Esaminare il codice di autenticazione

L'app Web di esempio deve eseguire l'autenticazione in due archivi dati diversi:

  • Server di archiviazione BLOB di Azure in cui archivia e recupera le foto inviate dai revisori.
  • Un database server flessibile Database di Azure per PostgreSQL in cui vengono archiviati ristoranti e recensioni.

Usa DefaultAzureCredential per eseguire l'autenticazione in entrambi gli archivi dati. Con DefaultAzureCredential, l'app può essere configurata per l'esecuzione con l'identità di entità servizio diverse, a seconda dell'ambiente in cui è in esecuzione, senza apportare modifiche al codice. Ad esempio, in un ambiente di sviluppo locale, l'app può essere eseguita con l'identità dello sviluppatore che ha eseguito l'accesso all'interfaccia della riga di comando di Azure, mentre in Azure, come in questa esercitazione, può essere eseguita con l'identità gestita assegnata dal sistema.

In entrambi i casi, l'entità di sicurezza in cui viene eseguita l'app deve avere un ruolo in ogni risorsa di Azure usata dall'app che consente di eseguire le azioni sulla risorsa richiesta dall'app. In questa esercitazione si usano i connettori di servizio per abilitare automaticamente l'identità gestita assegnata dal sistema nell'app in Azure e assegnare tali ruoli appropriati per l'identità nell'account di archiviazione di Azure e Database di Azure per PostgreSQL server.

Dopo aver abilitato l'identità gestita assegnata dal sistema e aver assegnato i ruoli appropriati negli archivi dati, è possibile usare DefaultAzureCredential per eseguire l'autenticazione con le risorse di Azure necessarie.

Il codice seguente viene usato per creare un client di archiviazione BLOB per caricare le foto in app.py. Un'istanza di viene fornita al client, che usa per acquisire i token di DefaultAzureCredential accesso per eseguire operazioni sull'archiviazione di Azure.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

azure_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
    account_url=account_url,
    credential=azure_credential)

Un'istanza di viene usata anche per ottenere un token di DefaultAzureCredential accesso per Database di Azure per PostgreSQL in ./azureproject/get_conn.py. In questo caso, il token viene acquisito direttamente chiamando get_token nell'istanza delle credenziali e passando il valore appropriato scope . Il token viene quindi usato al posto della password nell'URI di connessione PostgreSQL restituito al chiamante.

azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conn = str(current_app.config.get('DATABASE_URI')).replace('PASSWORDORTOKEN', token.token)

Per altre informazioni sull'autenticazione delle app con i servizi di Azure, vedere Autenticare le app Python nei servizi di Azure usando Azure SDK per Python. Per altre informazioni su DefaultAzureCredential, tra cui come personalizzare la catena di credenziali valutata per l'ambiente, vedere Panoramica di DefaultAzureCredential.

Creare un server PostgreSQL di Azure

  1. Configurare le variabili di ambiente necessarie per l'esercitazione.

    LOCATION="eastus"
    RAND_ID=$RANDOM
    RESOURCE_GROUP_NAME="msdocs-mi-web-app"
    APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID"
    DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID"
    ADMIN_USER="demoadmin"
    ADMIN_PW="ChAnG33#ThsPssWD$RAND_ID"
    

    Importante

    ADMIN_PW Deve contenere da 8 a 128 caratteri da tre delle categorie seguenti: lettere maiuscole, lettere minuscole, numeri e caratteri non alfanumerici. Quando si creano nomi utente o password non si usa il $ carattere . Successivamente, si creano variabili di ambiente con questi valori, in cui il carattere $ ha un significato speciale all'interno del contenitore Linux usato per eseguire le app Python.

  2. Creare un gruppo di risorse con il comando az group create.

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. Creare un server PostgreSQL con il comando az postgres flexible-server create . (Questo e i comandi successivi usano il carattere di continuazione della riga per la shell Bash ('\'). Modificare il carattere di continuazione della riga per la shell, se necessario.

    az postgres flexible-server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $DB_SERVER_NAME \
      --location $LOCATION \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --sku-name Standard_D2ds_v4
    

    Sku-name è il nome del piano tariffario e della configurazione di calcolo. Per altre informazioni, vedere Piano tariffario di Database di Azure per PostgreSQL. Per elencare gli SKU disponibili, usare az postgres flexible-server list-skus --location $LOCATION.

  4. Creare un database denominato restaurant usando il comando az postgres flexible-server execute .

    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --database-name postgres \
      --querytext 'create database restaurant;'
    

Creare un servizio app Azure e distribuire il codice

  1. Creare un servizio app usando il comando az webapp up .

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --runtime PYTHON:3.9 \
      --sku B1
    

    Lo SKU definisce le dimensioni (CPU, memoria) e il costo del piano di servizio app. Il piano di servizio B1 (Basic) comporta un costo ridotto nella sottoscrizione di Azure. Per un elenco completo dei piani del Servizio app, visualizzare la pagina Prezzi del Servizio app.

  2. Configurare servizio app per usare il start.sh nel repository con il comando az webapp config set.

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --startup-file "start.sh"
    

Creare connettori senza password per le risorse di Azure

I comandi di Service Connector configurano Archiviazione di Azure e Database di Azure per PostgreSQL risorse per l'uso dell'identità gestita e del controllo degli accessi in base al ruolo di Azure. I comandi creano le impostazioni dell'app nella servizio app che connettono l'app Web a queste risorse. L'output dei comandi elenca le azioni del connettore del servizio eseguite per abilitare la funzionalità senza password.

  1. Aggiungere un connettore di servizio PostgreSQL con il comando az webapp connection create postgres-flexible . L'identità gestita assegnata dal sistema viene usata per autenticare l'app Web nella risorsa di destinazione, PostgreSQL in questo caso.

    az webapp connection create postgres-flexible \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --target-resource-group $RESOURCE_GROUP_NAME \
      --server $DB_SERVER_NAME \
      --database restaurant \
      --client-type python \
      --system-identity
    
  2. Aggiungere un connettore del servizio di archiviazione con il comando az webapp connection create storage-blob .

    Questo comando aggiunge anche un account di archiviazione e aggiunge l'app Web con ruolo Collaboratore ai dati blob di archiviazione all'account di archiviazione.

    STORAGE_ACCOUNT_URL=$(az webapp connection create storage-blob \
      --new true \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --target-resource-group $RESOURCE_GROUP_NAME \
      --client-type python \
      --system-identity \
      --query configurations[].value \
      --output tsv)
    STORAGE_ACCOUNT_NAME=$(cut -d . -f1 <<< $(cut -d / -f3 <<< $STORAGE_ACCOUNT_URL))
    

Creare un contenitore nell'account di archiviazione

L'app Python di esempio archivia le foto inviate dai revisori come BLOB in un contenitore nell'account di archiviazione.

  • Quando un utente invia una foto con la revisione, l'app di esempio scrive l'immagine nel contenitore usando l'identità gestita assegnata dal sistema per l'autenticazione e l'autorizzazione. Questa funzionalità è stata configurata nell'ultima sezione.

  • Quando un utente visualizza le recensioni per un ristorante, l'app restituisce un collegamento alla foto nell'archivio BLOB per ogni recensione associata. Affinché il browser visualizzi la foto, deve essere in grado di accedervi nell'account di archiviazione. I dati BLOB devono essere disponibili per la lettura pubblica tramite l'accesso anonimo (non autenticato).

Per migliorare la sicurezza, gli account di archiviazione vengono creati con accesso anonimo ai dati BLOB disabilitati per impostazione predefinita. In questa sezione si abilita l'accesso in lettura anonimo nell'account di archiviazione e quindi si crea un contenitore denominato photos che fornisce l'accesso pubblico (anonimo) ai RELATIVI BLOB.

  1. Aggiornare l'account di archiviazione per consentire l'accesso in lettura anonimo ai BLOB con il comando az storage account update .

    az storage account update \
      --name $STORAGE_ACCOUNT_NAME \
      --resource-group $RESOURCE_GROUP_NAME \
      --allow-blob-public-access true
    

    L'abilitazione dell'accesso anonimo nell'account di archiviazione non influisce sull'accesso per i singoli BLOB. È necessario abilitare in modo esplicito l'accesso pubblico ai BLOB a livello di contenitore.

  2. Creare un contenitore denominato photos nell'account di archiviazione con il comando az storage container create . Consentire l'accesso in lettura anonima (pubblico) ai BLOB nel contenitore appena creato.

    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --account-key $(az storage account keys list --account-name $STORAGE_ACCOUNT_NAME \
          --query [0].value --output tsv) 
    

    Nota

    Per brevità, questo comando usa la chiave dell'account di archiviazione per autorizzare con l'account di archiviazione. Per la maggior parte degli scenari, l'approccio consigliato da Microsoft consiste nell'usare i ruoli Microsoft Entra ID e Azure (RBAC). Per un rapido set di istruzioni, vedere Avvio rapido: Creare, scaricare ed elencare BLOB con l'interfaccia della riga di comando di Azure. Si noti che diversi ruoli di Azure consentono di creare contenitori in un account di archiviazione, tra cui "Proprietario", "Collaboratore", "Proprietario dei dati BLOB di archiviazione" e "Collaboratore ai dati dei BLOB di archiviazione".

Per altre informazioni sull'accesso in lettura anonimo ai dati BLOB, vedere Configurare l'accesso in lettura anonimo per contenitori e BLOB.

Testare l'app Web Python in Azure

L'app Python di esempio usa il pacchetto azure.identity e la relativa DefaultAzureCredential classe. Quando l'app è in esecuzione in Azure, DefaultAzureCredential rileva automaticamente se esiste un'identità gestita per il servizio app e, in tal caso, la usa per accedere ad altre risorse di Azure (archiviazione e PostgreSQL in questo caso). Non è necessario fornire chiavi di archiviazione, certificati o credenziali al servizio app per accedere a queste risorse.

  1. Passare all'applicazione distribuita nell'URL http://$APP_SERVICE_NAME.azurewebsites.net.

    L'avvio dell'app può richiedere un minuto o due. Se viene visualizzata una pagina dell'app predefinita che non è la pagina predefinita dell'app di esempio, attendere un minuto e aggiornare il browser.

  2. Testare la funzionalità dell'app di esempio aggiungendo un ristorante e alcune recensioni con foto per il ristorante.

    Le informazioni sul ristorante e sulla revisione vengono archiviate in Database di Azure per PostgreSQL e le foto vengono archiviate in Archiviazione di Azure. Ecco uno screenshot di esempio:

    Screenshot dell'app di esempio che mostra la funzionalità di revisione del ristorante usando app Azure Servizio, Azure Postgre database SQL e Archiviazione di Azure.

Eseguire la pulizia

In questa esercitazione tutte le risorse di Azure sono state create nello stesso gruppo di risorse. La rimozione del gruppo di risorse rimuove con il comando az group delete rimuove tutte le risorse nel gruppo di risorse ed è il modo più rapido per rimuovere tutte le risorse di Azure usate per l'app.

az group delete  --name $RESOURCE_GROUP_NAME 

Facoltativamente, è possibile aggiungere l'argomento --no-wait per consentire al comando di tornare prima del completamento dell'operazione.

Passaggi successivi