Esercitazione: Connettere un'app Web Django a Azure PostgreSQL tramite Service Connector

Questa esercitazione illustra come distribuire un'app Web Django basata sui dati Python in Servizio app di Azure e usare Service Connector per connetterla ad altri servizi Azure. L'app Web di esempio archivia i ristoranti e esamina le informazioni in un database Database di Azure per PostgreSQL e archivia le foto in un contenitore Archiviazione di Azure.

Usare interfaccia della riga di comando di Azure per completare le attività seguenti:

Nota

Questa esercitazione è simile all'esercitazione App Service Distribuire un'app web Django Python con PostgreSQL in Azure, ma utilizza un'identità gestita senza password assegnata dal sistema con controllo degli accessi basato sui ruoli di Azure per accedere ad altre risorse Azure. La sezione Creare una connessione al servizio senza password di questo articolo illustra come Service Connector semplifica il processo di connessione.

L'app Web usa la classe DefaultAzureCredential della libreria client Python Azure Identity per rilevare automaticamente quando esiste un'identità gestita e la usa per accedere alle altre risorse.

Prerequisiti

Configurazione dell'ambiente

  1. Assicurati che l'abbonamento sia registrato per usare i provider di risorse Microsoft.ServiceLinker e Microsoft.DBforPostgreSQL. In caso contrario, eseguire az provider register -n Microsoft.[name of service] per registrare i provider.

  2. Installare le estensioni interfaccia della riga di comando di Azure seguenti:

    az extension add --name serviceconnector-passwordless --upgrade
    az extension add --name rdbms-connect
    

Clonare l'app di esempio

  1. Clona il repository dell'app di esempio.

    git clone https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless.git
    

    In alternativa, è possibile scaricare l'app da https://github.com/Azure-Samples/serviceconnector-webapp-postgresql-django-passwordless e decomprimerla in una cartella denominata serviceconnector-webapp-postgresql-django-passwordless.

  2. Modificare le directory nella cartella del repository usando cd serviceconnector-webapp-postgresql-django-passwordless ed eseguire tutti i comandi rimanenti da tale cartella.

Nell'app di esempio le impostazioni di produzione dell'app Web si trovano nel file azuresite/production.py . Le impostazioni di sviluppo si trovano in azuresite/settings.py. Le impostazioni di produzione configurano Django per l'esecuzione in qualsiasi ambiente di produzione e non sono specifiche del servizio app.

L'app usa le impostazioni di produzione quando viene impostata la WEBSITE_HOSTNAME variabile di ambiente. Per Azure stringhe di connessione Postgres, il servizio app imposta automaticamente questa variabile sull'URL dell'app Web, ad esempio https://msdocs-django.azurewebsites.net.

Per altre informazioni, vedere l'elenco di controllo per la distribuzione di Django. Vedere anche le impostazioni di Production per Django in Azure.

Definire le variabili di ambiente iniziali

Il codice seguente definisce le variabili di ambiente necessarie per questa esercitazione.

  • LOCATION deve essere un'area di Azure in cui la tua sottoscrizione ha una quota sufficiente per creare le risorse e che non impone restrizioni per Database di Azure per PostgreSQL nella tua sottoscrizione.
  • ADMIN_PW Deve contenere da 8 a 128 caratteri in almeno tre delle quattro categorie lettere maiuscole, lettere minuscole, numeri e caratteri non alfanumerici, esclusi $.
  1. Configurare le variabili di ambiente seguenti, sostituendo i <region> segnaposto e <database password> con valori validi.

    LOCATION="<region>"
    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="<database password>"
    
  2. Creare un gruppo di risorse per contenere tutte le risorse del progetto. Il nome del gruppo di risorse viene memorizzato nella cache e applicato automaticamente ai comandi successivi.

    az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
    

Distribuire il codice dell'app su App Service

Creare l'host dell'app nel servizio app e distribuire il codice dell'app di esempio in tale host. Il az webapp up comando esegue le azioni seguenti:

  • Crea un piano di servizio app nel piano tariffario Basic (B1).
  • Crea l'app del servizio App Service.
  • Abilita la registrazione predefinita per l'app.
  • Carica il repository usando la distribuzione ZIP con l'automazione della compilazione abilitata.
  • Compila l'app.

Nel codice sku definisce la CPU, la memoria e il costo del piano di servizio app. Il piano di servizio Basic (B1) comporta un costo ridotto nella sottoscrizione Azure. È possibile omettere il --sku parametro per usare lo SKU predefinito, in genere P1v3 (Premium v3). Per un elenco completo dei piani di servizio app, vedere Prezzi del servizio app.

  1. Dalla cartella del repository serviceconnector-webapp-postgresql-django-passwordless eseguire il comando seguente az webapp up :

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

    Nota

    La distribuzione richiede alcuni minuti e il comando può bloccarsi o andare in timeout, in particolare su uno SKU di tipo Basic. Dopo che l'app viene compilata correttamente e l'output mostra Starting the site, è possibile uscire dal comando selezionando CTRL+C.

  2. Configurare l'app per l'uso del repository start.sh file eseguendo il comando az webapp config set .

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

Creare il database Postgres in Azure

Creare il database Database di Azure per PostgreSQL per archiviare le informazioni dell'app. Il comando az postgres flexible-server create crea un server flessibile Database di Azure per PostgreSQL nel gruppo di risorse specificato con:

  • Nome del --name server specificato nel parametro . Il nome deve essere univoco in tutte le Azure.
  • SKU specificato nel --sku-name parametro .
  • Nome utente e password dell'account amministratore specificati nei parametri --admin-user e --admin-password.
  1. Creare il server Database di Azure per PostgreSQL. Se viene richiesto di abilitare l'accesso all'indirizzo IP client corrente, immettere y sì.

    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 \
      --microsoft-entra-auth Enabled
    
  2. Se non viene richiesto di abilitare l'accesso all'indirizzo IP client corrente, configurare una regola del firewall nel server con il comando az postgres flexible-server firewall-rule create . Questa regola consente all'ambiente locale di accedere al server.

    IP_ADDRESS=<your IP address>
    az postgres flexible-server firewall-rule create \
       --resource-group $RESOURCE_GROUP_NAME \
       --name $DB_SERVER_NAME \
       --rule-name AllowMyIP \
       --start-ip-address $IP_ADDRESS \
       --end-ip-address $IP_ADDRESS
    

    Suggerimento

    Utilizzare qualsiasi strumento o sito Web che mostri l'indirizzo IP per sostituire <your IP address> nel comando. Ad esempio, è possibile usare What's My IP Address?.

  3. Creare un database denominato restaurant nel server 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 una connessione al servizio senza password

Usare az webapp connection create postgres-flexible per aggiungere un connettore di servizio che connette l'app Web Azure al database Postgres usando l'autenticazione dell'identità gestita senza password. Il comando seguente configura il database di Azure per PostgreSQL per usare l'identità gestita e il controllo degli accessi in base al ruolo di Azure. L'output del comando elenca le azioni eseguite da Service Connector.

Il comando crea una variabile di ambiente denominata AZURE_POSTGRESQL_CONNECTIONSTRING che fornisce le informazioni di connessione al database per l'app. Il codice dell'app accede alle variabili di ambiente dell'app con istruzioni come os.environ.get('AZURE_POSTGRESQL_HOST'). Per altre informazioni, vedere Accedere alle variabili di ambiente.

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

Creare e connettersi a un account di archiviazione

Usare az webapp connection create storage-blob per creare un account di archiviazione Azure e un connettore di servizio. Il comando esegue le azioni seguenti:

  • Abilita l'identità gestita assegnata dal sistema nell'app Web.
  • Aggiunge l'app Web con il ruolo Collaboratore dati BLOB di archiviazione al nuovo account di archiviazione.
  • Configura la rete dell'account di archiviazione per accettare l'accesso dall'app Web.
  • Crea una variabile di ambiente denominata AZURE_STORAGEBLOB_RESOURCEENDPOINT per l'account Archiviazione di Azure.
  1. Eseguire il comando seguente per creare l'account di archiviazione e la connessione:

    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))
    
  2. Aggiornare l'account di archiviazione per consentire l'accesso pubblico ai blob agli utenti dell'app per accedere alle foto.

     az storage account update  \
       --name $STORAGE_ACCOUNT_NAME \
       --allow-blob-public-access 
    
  3. Usare az storage container create per creare un contenitore denominato photos nell'account di archiviazione e consentire l'accesso in lettura pubblico anonimo ai BLOB nel nuovo contenitore.

    # Set the BLOB_ENDPOINT variable
    BLOB_ENDPOINT=$(az storage account show --name $STORAGE_ACCOUNT_NAME --query "primaryEndpoints.blob" | sed 's/"//g')
    echo $BLOB_ENDPOINT
    
    # Create the storage container using the BLOB_ENDPOINT variable
    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login \
      --blob-endpoint $BLOB_ENDPOINT
    

Testare l'app Web Python in Azure

Aprire e testare l'app Web Azure Restaurant Review. L'app usa il pacchetto azure.identity e la relativa DefaultAzureCredential classe. Quando l'app è in esecuzione in Azure, il DefaultAzureCredential rileva automaticamente quando esiste un'identità gestita per il servizio app e la usa per accedere alle risorse Archiviazione di Azure e Database di Azure per PostgreSQL. L'app non deve fornire chiavi di archiviazione, certificati o credenziali per accedere a queste risorse.

  • Per un'installazione interfaccia della riga di comando di Azure locale, è possibile usare az webapp browse per aprire l'app nel browser predefinito:

    az webapp browse --name $APP_SERVICE_NAME.azurewebsites.net --resource-group $RESOURCE_GROUP_NAME
    
  • Azure Cloud Shell non è possibile aprire un browser locale, quindi non supporta il comando az webapp browse. Da Cloud Shell, il modo più semplice per aprire l'app Web consiste nel selezionare il collegamento Dominio predefinito in alto a destra nella pagina del portale di Azure dell'app.

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

Testare la funzionalità dell'app di esempio aggiungendo un ristorante e alcune recensioni con le foto. L'app dovrebbe essere simile allo screenshot seguente:

Screenshot dell'app di esempio che mostra la funzionalità di revisione del ristorante usando servizio app, Database di Azure per PostgreSQL e Archiviazione di Azure.

Pulire le risorse

Per evitare addebiti in corso, è possibile eliminare le risorse create per questa esercitazione eliminando il gruppo di risorse che li contiene. Assicurarsi di non avere più bisogno dell'app o delle risorse prima di eseguire il comando.

az group delete --name $RESOURCE_GROUP_NAME --no-wait

L'eliminazione di tutte le risorse può richiedere tempo. Con l'argomento --no-wait, il comando restituisce immediatamente il risultato.

Risoluzione dei problemi

Se si verificano problemi durante l'esecuzione di questa esercitazione, vedere le risorse seguenti: