Freigeben über


Bereitstellen einer containerisierten Python-App in App Service

Dieser Artikel ist Teil eines Lernprogramms zum Containerisieren und Bereitstellen einer Python-Web-App für Azure App Service. Mit dem App Service können Sie containerisierte Web-Apps ausführen und über die Funktionalitäten für kontinuierliche Integration/kontinuierliche Bereitstellung (CI/CD) mit Docker Hub, Azure Container Registry und Visual Studio Team Services bereitstellen.

In diesem Teil des Tutorials lernen Sie, wie Sie die containerisierte Python Web-App mithilfe der App-Service-Web-App für Container im App Service bereitstellen. Durch die Web-App für Container können Sie sich auf das Zusammenstellen von Containern konzentrieren, ohne sich mit dem Verwalten und Warten eines zugrunde liegenden Containerorchestrators befassen zu müssen.

Nachdem Sie die Schritte in diesem Artikel befolgt haben, haben Sie eine App Service-Website unter Verwendung eines Docker-Container-Images. Der App Service zieht das initiale Image aus der Azure Container Registry unter Verwendung der verwalteten Identität zur Authentifizierung.

Dieses Dienstdiagramm hebt die in diesem Artikel behandelten Komponenten hervor.

Screenshot der im Tutorial verwendeten Dienste – Containerisierte Python-App mit hervorgehobenem Bereitstellungspfad in Azure.

Erstellen der Web-App

Azure CLI-Befehle können in der Azure Cloud Shell oder auf einer Arbeitsstation ausgeführt werden, auf der die Azure CLIinstalliert ist.

  1. Ermitteln Sie die Ressourcen-ID der Gruppe, die Azure Container Registry enthält, mit dem Befehl 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 sollte in Ihrer Umgebung immer noch auf den Namen der Ressourcengruppe festgelegt sein, den Sie in Teil 3. Erstellen von Containern in Azure dieses Tutorials verwendet haben. Ist dies nicht der Fall, entfernen Sie die Kommentare in der ersten Zeile und legen Sie den Namen fest, den Sie verwendet haben.

  2. Erstellen Sie mit dem Befehl az appservice plan create einen App Service-Plan.

    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. Erstellen Sie eine Web-App mit dem Befehl az webapp create.

    Der folgende Befehl aktiviert auch die vom System zugewiesene verwaltete Identität für die Web-App und weist ihr die AcrPull-Rolle auf der angegebenen Ressource zu – in diesem Fall die Ressourcengruppe, die die Azure Container Registry enthält. Dadurch erhält die vom System zugewiesene verwaltete Identität Zugriffsrechte auf jede Azure Container Registry in der Ressourcengruppe.

    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 
    

    Wo:

    • APP_SERVICE_NAME muss global eindeutig sein, da er zum Websitenamen in der URL https://<website-name>.azurewebsites.netwird.
    • CONTAINER_NAME hat die Form "yourregistryname.azurecr.io/repo_name:tag".
    • REGISTRY_NAME sollte in Ihrer Umgebung weiterhin auf den Registrierungsnamen festgelegt werden, den Sie in Teil 3. Build Container in Azure dieses Tutorials verwendet haben. Wenn dies nicht der Fall ist, heben Sie die Kommentierung der Zeile auf, in der der Name im Code-Snippet festgelegt ist, und setzen Sie ihn auf den von Ihnen verwendeten Namen.

    Anmerkung

    Möglicherweise wird beim Ausführen des Befehls ein Fehler wie folgt angezeigt:

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

    Dieser Fehler tritt auf, weil die Web-App standardmäßig die Admins-Anmeldedaten der Azure-Containerregistrierung zur Authentifizierung bei der Registrierung verwendet und diese Admins-Anmeldedaten in der Registrierung nicht aktiviert wurden. Sie können diesen Fehler sicher ignorieren, da Sie die Web-App so festlegen, dass die vom System zugewiesene verwaltete Identität für die Authentifizierung im nächsten Befehl verwendet wird.

Konfigurieren der verwalteten Identität und des Webhooks

  1. Konfigurieren Sie die Web-App so, dass sie verwaltete Identitäten verwendet, um aus der Azure-Containerregistrierung abzurufen, indem Sie den Befehl az webapp config set verwenden.

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

    Da Sie beim Erstellen der Web-App die vom System zugewiesene verwaltete Identität aktiviert haben, ist es die verwaltete Identität, die zum Abrufen aus der Azure-Containerregistrierung verwendet wird.

  2. Holen Sie sich die Anmeldeinformationen für den Anwendungsbereich mit dem Befehl 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. Verwenden Sie die Anmeldeinformationen für den Anwendungsbereich, um einen Webhook mit dem Befehl az acr webhook create zu erstellen.

    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 
    

    Standardmäßig erstellt dieser Befehl den Webhook in derselben Ressourcengruppe und demselben Speicherort wie die angegebene Azure Container-Registrierung. Bei Bedarf können Sie die parameter --resource-group und --location verwenden, um dieses Verhalten außer Kraft zu setzen.

Konfigurieren der Verbindung mit MongoDB

In diesem Schritt geben Sie Umgebungsvariablen an, die zum Herstellen einer Verbindung mit MongoDB erforderlich sind.

Wenn Sie eine Azure Cosmos DB für MongoDB erstellen müssen, empfehlen wir Ihnen, die Schritte zum Einrichten von Cosmos DB für MangoDB in Teil 2. Container lokal erstellen und testen dieses Tutorials zu befolgen. Wenn Sie fertig sind, sollten Sie eine Azure Cosmos DB for MongoDB Verbindungszeichenfolge der Form mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters> haben.

Sie benötigen die MongoDB-Verbindungszeichenfolge, um die folgenden Schritte auszuführen.

Mithilfe des folgenden Befehls az webapp config appsettings set werden App-Einstellungen erstellt, um Umgebungsvariablen in App Service festzulegen:

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: Eine Verbindungszeichenfolge, die mit "mongodb://" beginnt.
  • DB_NAME: Verwenden Sie "restaurants_reviews".
  • COLLECTION_NAME: Verwenden Sie "restaurants_reviews".

Website durchsuchen

Um zu überprüfen, ob die Website ausgeführt wird, gehen Sie zu https://<website-name>.azurewebsites.net, wobei Website-Name der Dienstname Ihrer App ist. Wenn dies erfolgreich war, sollten Sie die Beispiel-App für Restaurantbewertungen sehen. Es kann einige Momente dauern, bis die Website zum ersten Mal gestartet wird. Wenn die Website angezeigt wird, fügen Sie ein Restaurant und eine Rezension für dieses Restaurant hinzu, um zu bestätigen, dass die Beispiel-App funktioniert.

Wenn Sie die Azure CLI lokal ausführen, können Sie den Befehl az webapp browse verwenden, um die Website zu öffnen. Wenn Sie Cloud Shell verwenden, öffnen Sie ein Browserfenster, und navigieren Sie zur Website-URL.

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

Anmerkung

Der Befehl az webapp browse wird in Cloud Shell nicht unterstützt. Öffnen Sie stattdessen ein Browserfenster, und navigieren Sie stattdessen zur Website-URL.

Problembehandlung bei der Bereitstellung

Wenn die Beispiel-App nicht angezeigt wird, führen Sie die folgenden Schritte aus.

  • Überprüfen Sie bei der Bereitstellung von Containern und dem App Service immer die Seite Deployment Center / Logs im Azure-Portal. Bestätigen Sie, dass der Container gezogen wurde und ausgeführt wird. Das erstmalige Abrufen und Ausführen des Containers kann ein paar Augenblicke dauern.
  • Versuchen Sie, den App-Dienst neu zu starten, und überprüfen Sie, ob das Problem behoben wird.
  • Wenn Programmierfehler auftreten, werden diese Fehler in den Anwendungsprotokollen angezeigt. Wählen Sie auf der Seite des Azure-Portals für den App Service Probleme diagnostizieren und lösen/Anwendungsprotokolle.
  • Die Beispiel-App basiert auf einer Verbindung mit MongoDB. Vergewissern Sie sich, dass der App-Dienst Über Anwendungseinstellungen mit den richtigen Verbindungsinformationen verfügt.
  • Vergewissern Sie sich, dass die verwaltete Identität für den App-Dienst aktiviert ist und im Deployment Center verwendet wird. Gehen Sie auf der Azure-Portalseite für den App Service zur Ressource App Service Deployment Center und bestätigen Sie, dass Authentifizierung auf Verwaltete Identität eingestellt ist.
  • Überprüfen Sie, ob der Webhook in der Azure-Containerregistrierung definiert ist. Mit dem Webhook kann der App Service das Image des Containers abrufen. Stellen Sie insbesondere sicher, dass die URI des Dienstes mit "/api/registry/webhook" endet.
  • Verschiedene Azure Container Registry-SKUs haben unterschiedliche Funktionen, darunter die Anzahl von Webhooks. Wenn Sie eine bestehende Registrierung wiederverwenden, könnte die folgende Nachricht angezeigt werden: "Kontingent für Ressourcentyp Webhooks für die Registrierung SKU Basic überschritten. Erfahren Sie mehr über verschiedene SKU-Kontingente und Upgradeprozesse: https://aka.ms/acr/tiers". Wenn Sie diese Nachricht sehen, verwenden Sie eine neue Registrierung oder reduzieren Sie die Anzahl der verwendeten Registrierungs-Webhooks.

Nächster Schritt