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 App Service können Sie containerisierte Web-Apps ausführen und über die Funktionen für kontinuierliche Integration/kontinuierliche Bereitstellung (CI/CD) mit Docker Hub, Azure Container Registry und Visual Studio Team Services bereitstellen.

In diesem Teil des Lernprogramms erfahren Sie, wie Sie die containerisierte Python-Web-App mithilfe der App Service Web App für Container in 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.

Wenn Sie die hier beschriebenen Schritte ausführen, erhalten Sie eine App Service-Website mit einem Docker-Containerimage. Der App-Dienst ruft das anfängliche Image aus der Azure-Containerregistrierung mithilfe der verwalteten Identität für die Authentifizierung ab.

Das unten gezeigte Dienstdiagramm hebt die in diesem Artikel behandelten Komponenten hervor.

A screenshot of the services using in the Tutorial - Containerized Python App on Azure with deployment path highlighted.

1. Erstellen der Web-App

Azure CLI-Befehle können in der Azure Cloud Shell oder auf einer Workstation mit installierter Azure CLI ausgeführt werden.

Schritt 1. Rufen Sie die Ressourcen-ID der Gruppe ab, die Azure Container Registry mit dem Befehl "az group show" enthält.

# RESOURCE_GROUP_NAME='msdocs-web-app-rg'

RESOURCE_ID=$(az group show \
  --resource-group $RESOURCE_GROUP_NAME \
  --query id \
  --output tsv)
echo $RESOURCE_ID

Im obigen Befehl sollte RESOURCE_GROUP_NAME in Ihrer Umgebung weiterhin auf den Ressourcengruppennamen festgelegt werden, den Sie in Teil 3 verwendet haben. Erstellen Sie den Container in Azure in diesem Lernprogramm. Wenn dies nicht der Fall ist, heben Sie die Auskommentierung der ersten Zeile auf, und stellen Sie sicher, dass sie auf den verwendeten Namen festgelegt ist.

Schritt 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

Schritt 3. Erstellen Sie eine Web-App mit dem Befehl "az webapp create ".

Der folgende Befehl ermöglicht außerdem die vom System zugewiesene verwaltete Identität für die Web-App und weist sie der AcrPull Rolle für die angegebene Ressource zu . In diesem Fall die Ressourcengruppe, die die Azure-Containerregistrierung enthält. Dadurch werden die vom System zugewiesenen verwalteten Identitäts-Pullberechtigungen für eine beliebige Azure-Containerregistrierung in der Ressourcengruppe gewährt.

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 

Im obigen Befehl:

  • APP_SERVICE_NAME muss global eindeutig sein, da er in der URL https://<website-name>.azurewebsites.netzum Websitenamen wird.
  • CONTAINER_NAME ist 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 verwendet haben. Erstellen Sie den Container in Azure in diesem Lernprogramm. Wenn dies nicht der Fall ist, heben Sie die Kommentarkommentierung der Zeile auf, in der sie oben festgelegt ist, und stellen Sie sicher, dass sie auf den von Ihnen verwendeten Namen festgelegt ist.

Hinweis

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, da die Web-App standardmäßig die Administratoranmeldeinformationen der Azure-Containerregistrierung verwendet, um sich bei der Registrierung und den Administratoranmeldeinformationen zu authentifizieren, 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.

2. Konfigurieren der verwalteten Identität und des Webhooks

Schritt 1. Konfigurieren Sie die Web-App so, dass verwaltete Identitäten zum Abrufen aus der Azure-Containerregistrierung mit dem Befehl "az webapp config set " verwendet werden.

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.

Schritt 2. Rufen Sie die Anmeldeinformationen für den Anwendungsbereich mit dem Az Webapp-Bereitstellungslisten-Publishing-Anmeldeinformationsbefehl ab.

CREDENTIAL=$(az webapp deployment list-publishing-credentials \
  --resource-group $RESOURCE_GROUP_NAME \
  --name $APP_SERVICE_NAME \
  --query publishingPassword \
  --output tsv)
echo $CREDENTIAL 

Schritt 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 dieses Verhalten mithilfe der --resource-group Parameter --location außer Kraft setzen.

3. 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 auszuführen. Erstellen und testen Sie den Container lokal in diesem Lernprogramm. Wenn Sie fertig sind, sollten Sie über eine Azure Cosmos DB für MongoDB Verbindungszeichenfolge des Formulars mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>verfügen.

Sie benötigen die MongoDB-Verbindungszeichenfolge Informationen, 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".

4. Durchsuchen der Website

Um zu überprüfen, ob die Website ausgeführt wird, wechseln Sie zu https://<website-name>.azurewebsites.net; wobei der Websitename Ihr App-Dienstname ist. Bei erfolgreicher Ausführung sollte die Beispiel-App für die Restaurantüberprüfung angezeigt werden. 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 zur Website zu navigieren. 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 

Hinweis

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

5. Problembehandlung bei der Bereitstellung

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

  • Überprüfen Sie bei der Containerbereitstellung und dem App-Dienst immer die Seite "Deployment Center-Protokolle / " im Azure-Portal. Vergewissern Sie sich, dass der Container abgerufen und ausgeführt wird. Der anfängliche Pull und die Ausführung des Containers können einige Minuten 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 Azure-Portal für den App-Dienst "Anwendungsprotokolle diagnostizieren und lösen/" aus.
  • 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. Wechseln Sie auf der Seite Azure-Portal für den App-Dienst zur Ressource "App Service Deployment Center", und vergewissern Sie sich, dass die Authentifizierung auf verwaltete Identität festgelegt ist.
  • Überprüfen Sie, ob der Webhook in der Azure-Containerregistrierung definiert ist. Mit dem Webhook kann der App-Dienst das Containerimage abrufen. Überprüfen Sie insbesondere, ob der Dienst-URI mit "/api/registry/webhook" endet.
  • Verschiedene Azure-Containerregistrierungs-Skus weisen unterschiedliche Features auf, einschließlich der Anzahl von Webhooks. Wenn Sie eine vorhandene Registrierung verwenden, wird möglicherweise die Meldung "Kontingent überschritten für Ressourcentyp-Webhooks für die Registrierungs-SKU Basic. Erfahren Sie mehr über unterschiedliche SKU-Kontingente und Upgradeprozesse: https://aka.ms/acr/tiers". Wenn diese Meldung angezeigt wird, verwenden Sie eine neue Registrierung, oder verringern Sie die Anzahl der verwendeten Registrierungswebhooks .

Nächster Schritt