Condividi tramite


Distribuire un'app Python containerizzata nel Servizio App

Questo articolo fa parte di un'esercitazione su come inserire e distribuire un'app Web Python nel servizio app di Azure. Il servizio app consente di eseguire app Web in contenitori e distribuirlo tramite funzionalità di integrazione continua/distribuzione continua (CI/CD) con Docker Hub, Registro Azure Container e Visual Studio Team Services.

In questa parte dell'esercitazione si apprenderà come distribuire l'app Web Python in contenitori nel servizio app usando l'app Web del servizio app per contenitori. App Web per contenitori consente di concentrarsi sulla composizione dei vostri contenitori senza doversi preoccupare della gestione e manutenzione di un orchestratore di contenitori sottostante.

Dopo aver seguito i passaggi descritti in questo articolo, si termina con un sito Web del servizio app usando un'immagine del contenitore Docker. Il Servizio App scarica l'immagine iniziale dal Registro dei contenitori di Azure con l'identità gestita per l'autenticazione.

Questo diagramma dei servizi evidenzia i componenti trattati in questo articolo.

Screenshot dei servizi utilizzati nell'esercitazione - App Python containerizzata in Azure con il percorso di distribuzione evidenziato.

Creare l'app Web

I comandi della CLI di Azure possono essere eseguiti nella Azure Cloud Shell o in una workstation con la CLI di Azure installata.

  1. Ottenere l'ID risorsa del gruppo che contiene il Registro di Azure Container con il comando az group show.

    # RESOURCE_GROUP_NAME='msdocs-web-app-rg'
    
    RESOURCE_ID=$(az group show \
      --resource-group $RESOURCE_GROUP_NAME \
      --query id \
      --output tsv)
    echo $RESOURCE_ID
    

    RESOURCE_GROUP_NAME dovrebbe rimanere impostato nel tuo ambiente al nome del gruppo di risorse utilizzato nella parte 3. Costruire un contenitore in Azure di questo tutorial. Se non lo è, rimuovi il commento dalla prima riga e impostalo sul nome che hai usato.

  2. Creare un piano di servizio app con il comando az appservice plan create .

    APP_SERVICE_PLAN_NAME='msdocs-web-app-plan'
    
    az appservice plan create \
        --name $APP_SERVICE_PLAN_NAME \
        --resource-group $RESOURCE_GROUP_NAME \
        --sku B1 \
        --is-linux
    
  3. Creare un'app Web con il comando az webapp create.

    Il comando seguente abilita anche il identità gestita assegnata dal sistema per l'app Web e lo assegna al ruolo nella risorsa specificata, in questo caso il gruppo di risorse che contiene registro Azure Container. In questo modo vengono concessi i diritti di pull dell'identità gestita assegnata dal sistema a qualsiasi Registro Container di Azure nel gruppo di risorse.

    APP_SERVICE_NAME='<website-name>'
    # REGISTRY_NAME='<your Azure Container Registry name>'
    CONTAINER_NAME=$REGISTRY_NAME'.azurecr.io/msdocspythoncontainerwebapp:latest'
    
    az webapp create \
      --resource-group $RESOURCE_GROUP_NAME \
      --plan $APP_SERVICE_PLAN_NAME \
      --name $APP_SERVICE_NAME \
      --assign-identity '[system]' \
      --scope $RESOURCE_ID \
      --role acrpull \
      --deployment-container-image-name $CONTAINER_NAME 
    

    Dove:

    • APP_SERVICE_NAME deve essere globalmente univoco perché diventa il nome del sito Web nell'URL https://<website-name>.azurewebsites.net.
    • CONTAINER_NAME ha il formato "yourregistryname.azurecr.io/repo_name:tag".
    • REGISTRY_NAME deve comunque essere impostato nel tuo ambiente sul nome del registro usato nella parte 3. Creare un contenitore in Azure di questa esercitazione. In caso contrario, elimina il commento dalla riga in cui il valore viene impostato nel frammento di codice e impostalo sul nome che hai utilizzato.

    Nota

    Durante l'esecuzione del comando potrebbe essere visualizzato un errore simile al seguente:

    No credential was provided to access Azure Container Registry. Trying to look up...
    Retrieving credentials failed with an exception:'No resource or more than one were found with name ...'
    

    Questo errore si verifica perché l'app Web usa per impostazione predefinita le credenziali di amministratore del Registro Azure Container per l'autenticazione con il Registro di sistema e le credenziali di amministratore non sono state abilitate nel Registro di sistema. È possibile ignorare questo errore in modo sicuro perché l'app Web verrà impostata in modo da usare l'identità gestita assegnata dal sistema per l'autenticazione nel comando successivo.

Configurare l'identità gestita e il webhook

  1. Configurare l'app Web per utilizzare le identità gestite per eseguire il pull dal Registro Azure Container con il comando az webapp config set.

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --generic-configurations '{"acrUseManagedIdentityCreds": true}'
    

    Poiché è stata abilitata l'identità gestita assegnata dal sistema quando è stata creata l'app Web, sarà l'identità gestita usata per eseguire il pull dal Registro Azure Container.

  2. Ottenere le credenziali dell'ambito dell'applicazione con il comando az webapp deployment list-publishing-credentials az webapp deployment list-publishing-credentials.

    CREDENTIAL=$(az webapp deployment list-publishing-credentials \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --query publishingPassword \
      --output tsv)
    echo $CREDENTIAL 
    
  3. Usare le credenziali dell'ambito dell'applicazione per creare un webhook con il comando az acr webhook create.

    SERVICE_URI='https://$'$APP_SERVICE_NAME':'$CREDENTIAL'@'$APP_SERVICE_NAME'.scm.azurewebsites.net/api/registry/webhook'
    
    az acr webhook create \
      --name webhookforwebapp \
      --registry $REGISTRY_NAME \
      --scope msdocspythoncontainerwebapp:* \
      --uri $SERVICE_URI \
      --actions push 
    

    Per impostazione predefinita, questo comando crea il webhook nello stesso gruppo di risorse e nella stessa posizione del registro Azure Container specificato. Se lo si desidera, è possibile usare i parametri --resource-group e --location per eseguire l'override di questo comportamento.

Configurare la connessione a MongoDB

In questo passaggio si specificano le variabili di ambiente necessarie per connettersi a MongoDB.

Se è necessario creare un'istanza di Azure Cosmos DB per MongoDB, è consigliabile seguire la procedura per configurare Cosmos DB per MangoDB nella parte 2. Compilare e testare il contenitore in locale di questa esercitazione. Al termine, dovresti avere una stringa di connessione di Azure Cosmos DB per MongoDB della forma mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>.

Per seguire questa procedura, è necessaria la stringa di connessione MongoDB.

Per impostare le variabili di ambiente nel servizio app, è necessario creare impostazioni dell'app con il seguente comando az webapp config appsettings set.

MONGO_CONNECTION_STRING='your Mongo DB connection string in single quotes'
MONGO_DB_NAME=restaurants_reviews
MONGO_COLLECTION_NAME=restaurants_reviews

az webapp config appsettings set \
   --resource-group $RESOURCE_GROUP_NAME \
   --name $APP_SERVICE_NAME \
   --settings CONNECTION_STRING=$MONGO_CONNECTION_STRING \
              DB_NAME=$MONGO_DB_NAME  \
              COLLECTION_NAME=$MONGO_COLLECTION_NAME 
  • CONNECTION_STRING: stringa di connessione che inizia con "mongodb://".
  • DB_NAME: usare "restaurants_reviews".
  • COLLECTION_NAME: usare "restaurants_reviews".

Esplorare il sito

Per verificare che il sito sia in esecuzione, vai a https://<website-name>.azurewebsites.net; dove il nome del sito è il nome del servizio app. In caso di esito positivo, verrà visualizzata l'app di esempio per le recensioni del ristorante. L'avvio del sito può richiedere alcuni istanti. Quando viene visualizzato il sito, aggiungere un ristorante e una recensione per il ristorante per verificare che l'app di esempio funzioni.

Se si esegue la CLI di Azure in locale sul proprio computer, è possibile usare il comando az webapp browse per accedere al sito web. Se si usa Cloud Shell, aprire una finestra del browser e passare all'URL del sito Web.

az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME 

Nota

Il comando az webapp browse non è supportato in Cloud Shell. Aprire una finestra del browser e passare all'URL del sito Web.

Risolvere i problemi di distribuzione

Se l'app di esempio non viene visualizzata, provare i passaggi seguenti.

  • Con la distribuzione dei container e App Service, controllare sempre la pagina dei log Centro Distribuzione / nel portale di Azure. Verificare che il contenitore sia stato effettuato il pull e che sia in esecuzione. L'estrazione iniziale e l'esecuzione del contenitore possono richiedere alcuni istanti.
  • Provare a riavviare il servizio app e verificare se il problema viene risolto.
  • In caso di errori di programmazione, questi errori vengono visualizzati nei log applicazioni. Nella pagina del portale di Azure per l'App Service, selezionare Diagnostica e risolvi i problemi/log delle applicazioni.
  • L'app di esempio si basa su una connessione a MongoDB. Verificare che l'App Service disponga di impostazioni applicative con le informazioni di connessione corrette.
  • Verificare che l'identità gestita sia abilitata per il Servizio App e che venga usata nel Centro di distribuzione. Nella pagina del portale di Azure per l'App Service, passare alla risorsa App Service Centro distribuzione e confermare che autenticazione sia impostata su Identità Gestita.
  • Verificare che il webhook sia definito nel Registro Azure Container. Il webhook consente al Servizio App di recuperare l'immagine del contenitore. In particolare, verificare che l'URI del servizio termini con "/api/registry/webhook".
  • I diversi SKU del Registro Azure Container offrono funzionalità differenti, incluso il numero di webhook. Nel caso in cui si riutilizzi un registro esistente, è possibile visualizzare il messaggio "Quota superata per i webhook del tipo di risorsa per lo SKU Basic. Altre informazioni sulle diverse quote di SKU e sul processo di aggiornamento: https://aka.ms/acr/tiers". Se viene visualizzato questo messaggio, utilizzare un nuovo Registro di sistema o ridurre il numero di webhook del Registro di sistema attualmente in uso.

Passaggio successivo