Share via


Erstellen und Bereitstellen einer Python-Web-App mit Azure Container Apps und PostgreSQL

Dieser Artikel ist Teil eines Lernprogramms zum Containerisieren und Bereitstellen einer Python-Web-App für Azure-Container-Apps. Mit Container-Apps können Sie containerisierte Apps bereitstellen, ohne komplexe Infrastruktur zu verwalten.

In diesem Teil des Lernprogramms erfahren Sie, wie Sie eine Python-Beispiel-Web-App (Django oder Flask) containerisieren und bereitstellen. Insbesondere erstellen Sie das Containerimage in der Cloud und stellen es in Azure-Container-Apps bereit. Sie definieren Umgebungsvariablen, mit denen die Container-App eine Verbindung mit einer Azure-Datenbank für PostgreSQL herstellen kann – flexible Serverinstanz , in der die Beispiel-App Daten speichert.

Dieses Dienstdiagramm hebt die in diesem Artikel behandelten Komponenten hervor: Erstellen und Bereitstellen eines Containerimages.

A screenshot of the services in the Tutorial - Deploy a Python App on Azure Container Apps. Section highlighted is what is covered in this article.

Abrufen der Beispiel-App

Verzweigen Und klonen Sie den Beispielcode in Ihrer Entwicklerumgebung.

Schritt 1. Wechseln Sie zum GitHub-Repository der Beispiel-App (Django oder Flask), und wählen Sie "Verzweigung" aus.

Führen Sie die Schritte aus, um das Verzeichnis in Ihr GitHub-Konto zu verzweigen. Sie können das Coderepo auch direkt auf Ihren lokalen Computer herunterladen, ohne ein Forking oder ein GitHub-Konto zu erstellen, Sie können jedoch keine CI/CD einrichten, die weiter unten im Lernprogramm erläutert wird.

Schritt 2. Verwenden Sie den Befehl "Git Clone", um das verzweigte Repository in den Ordner "python-container " zu klonen:

# Django
git clone https://github.com/$USERNAME/msdocs-python-django-azure-container-apps.git python-container

# Flask
# git clone https://github.com/$USERNAME/msdocs-python-flask-azure-container-apps.git python-container

Schritt 3. Verzeichnis ändern.

cd python-container

Erstellen eines Containerimages aus Web App-Code

Nachdem Sie diese Schritte ausgeführt haben, verfügen Sie über eine Azure-Containerregistrierung, die ein Docker-Containerimage enthält, das aus dem Beispielcode erstellt wurde.

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

Schritt 1. Erstellen Sie mithilfe des Befehls az group create eine Ressourcengruppe.

az group create \
--name pythoncontainer-rg \
--location <location>

<location> is one of the Azure location Name values from the output of the command az account list-locations -o table.

Schritt 2. Erstellen Sie eine Containerregistrierung mit dem Befehl "az acr create ".

az acr create \
--resource-group pythoncontainer-rg \
--name <registry-name> \
--sku Basic \
--admin-enabled

<Der Registrierungsname> muss in Azure eindeutig sein und 5-50 alphanumerische Zeichen enthalten.

Sie können die anmeldeinformationen anzeigen, die für Den Administrator erstellt wurden, mit:

az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg

Schritt 3. Melden Sie sich mit dem Az acr-Anmeldebefehl bei der Registrierung an .

az acr login --name <registry-name>

Mit dem Befehl wird dem Namen "azurecr.io" hinzugefügt, um den vollqualifizierten Registrierungsnamen zu erstellen. Bei erfolgreicher Ausführung wird die Meldung "Anmeldung erfolgreich" angezeigt. Wenn Sie auf die Registrierung von einem anderen Abonnement als dem Abonnement zugreifen, in dem die Registrierung erstellt wurde, verwenden Sie die --suffix Option.

Schritt 4. Erstellen Sie das Image mit dem Az acr-Buildbefehl .

az acr build \
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .

Beachten Sie dabei Folgendes:

  • Der Punkt (".") am Ende des Befehls gibt den Speicherort des zu erstellenden Quellcodes an. Wenn Sie diesen Befehl nicht im Stammverzeichnis der Beispiel-App ausführen, geben Sie den Pfad zum Code an.

  • Wenn Sie den Befehl in Azure Cloud Shell ausführen, verwenden git clone Sie zuerst, um das Repository zuerst in die Cloud Shell-Umgebung abzurufen und das Verzeichnis in den Stamm des Projekts zu ändern, sodass punkt (".") richtig interpretiert wird.

  • Wenn Sie die -t Option (identisch mit --image) verlassen, stellt der Befehl einen lokalen Kontextbuild in die Warteschlange, ohne ihn an die Registrierung zu übertragen. Das Erstellen ohne Push kann hilfreich sein, um zu überprüfen, ob das Image erstellt wird.

Schritt 5. Vergewissern Sie sich, dass das Containerimage mit dem Befehl "az acr repository list" erstellt wurde.

az acr repository list --name <registry-name>

Erstellen einer flexiblen Serverinstanz von PostgreSQL

Die Beispiel-App (Django oder Flask) speichert Restaurant-Prüfdaten in einer PostgreSQL-Datenbank. In diesen Schritten erstellen Sie den Server, der die Datenbank enthält.

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

Schritt 1. Verwenden Sie den Befehl "az postgres flexiblen Server erstellen ", um den PostgreSQL-Server in Azure zu erstellen. Es ist nicht ungewöhnlich, dass dieser Befehl einige Minuten lang ausgeführt wird.

az postgres flexible-server create \
   --resource-group pythoncontainer-rg \
   --name <postgres-server-name>  \
   --location <location> \
   --admin-user <admin-username> \
   --admin-password <admin-password> \
   --sku-name Standard_D2s_v3 \
   --public-access 0.0.0.0 
  • "pythoncontainer-rg" → Der in diesem Lernprogramm verwendete Ressourcengruppenname. Wenn Sie einen anderen Namen verwendet haben, ändern Sie diesen Wert.

  • <postgres-server-name> → Der Name des PostgreSQL-Datenbankservers. Dieser Name muss in allen Azure eindeutig sein. Der Serverendpunkt ist "https://< postgres-server-name.postgres.database.azure.com>". Zulässige Zeichen sind "A"-"Z", "0"-"9" und "-".

  • <location>: Verwenden Sie den gleichen Standort wie für die Web-App. <location> is one of the Azure location Name values from the output of the command az account list-locations -o table.

  • <Administratorbenutzername> → Benutzername für das Administratorkonto. Es kann nicht "azure_superuser", "admin", "administrator", "root", "guest" oder "public" sein. Verwenden Sie "demoadmin" für dieses Lernprogramm.

  • <admin-password>: Das Kennwort des Administratorbenutzers. Es muss 8 bis 128 Zeichen aus drei der folgenden Kategorien enthalten: Englische Großbuchstaben, englische Kleinbuchstaben, Zahlen und nicht alphanumerische Zeichen.

    Wichtig

    Beim Erstellen von Benutzernamen oder Kennwörtern wird das Zeichen "$" nicht verwendet. Später erstellen Sie Umgebungsvariablen mit diesen Werten, bei denen das Zeichen "$" im Linux-Container, der zum Ausführen von Python-Apps verwendet wird, eine besondere Bedeutung hat.

  • <sku-name> → Der Name des Preisniveaus und der Berechnungskonfiguration, z. B. "Standard_D2s_v3". Weitere Informationen finden Sie unter Azure Database for PostgreSQL – Preise. Verwenden Sie az postgres flexible-server list-skus --location <location>zum Auflisten der verfügbaren SKUs .

  • <public-access> → "0.0.0.0", die den öffentlichen Zugriff auf den Server von einem beliebigen Azure-Dienst aus ermöglicht, z. B. Container-Apps.

Hinweis

Wenn Sie beabsichtigen, den PostgreSQL-Server von Ihrer lokalen Arbeitsstation mit anderen Tools als Azure CLI zu arbeiten, müssen Sie eine Firewallregel mit dem Befehl "az postgres flexible-server firewall-rule create " hinzufügen.

Erstellen einer Datenbank auf dem Server

An diesem Punkt haben Sie einen PostgreSQL-Server. In diesem Abschnitt erstellen Sie eine Datenbank auf dem Server.

Sie können die interaktive Terminal-psql von PostgreSQL in Ihrer lokalen Umgebung oder in der Azure Cloud Shell verwenden, auf die auch im Azure-Portal zugegriffen werden kann. Beim Arbeiten mit psql ist es oft einfacher, die Cloud Shell zu verwenden, da alle Abhängigkeiten für Sie in der Shell enthalten sind.

Schritt 1. Verbinden der Datenbank mit psql.

psql --host=<postgres-server-name>.postgres.database.azure.com \
     --port=5432 \
     --username=demoadmin@<postgres-server-name> \
     --dbname=postgres

Dabei <ist der Postgres-Server-Name> der Name des PostgreSQL-Servers. Der Befehl fordert Sie zur Eingabe des Administratorkennworts auf.

Wenn Sie Probleme beim Herstellen der Verbindung haben, starten Sie die Datenbank neu, und versuchen Sie es noch mal. Wenn Sie eine Verbindung aus Ihrer lokalen Umgebung herstellen, muss Ihre IP-Adresse der Firewallregelliste für den Datenbankdienst hinzugefügt werden.

Schritt 2. Erstellen Sie die Datenbank.

Geben Sie an der Eingabeaufforderung Folgendes postgres=> ein:

CREATE DATABASE restaurants_reviews;

Das Semikolon (";") am Ende des Befehls ist erforderlich. Verwenden Sie den Befehl \c restaurants_reviews, um zu überprüfen, ob die Datenbank erfolgreich erstellt wurde. Geben Sie \? ein, um die Hilfe anzuzeigen, oder \q, um den Vorgang zu beenden.

Sie können auch eine Verbindung mit dem flexiblen Azure PostgreSQL-Server herstellen und eine Datenbank mit Azure Data Studio oder einer anderen IDE erstellen, die PostgreSQL unterstützt.

Bereitstellen der Web-App in Container-Apps

Container-Apps werden in Container-Apps-Umgebungen bereitgestellt, die als sichere Grenze fungieren. In den folgenden Schritten erstellen Sie die Umgebung, einen Container innerhalb der Umgebung und konfigurieren den Container so, dass die Website extern sichtbar ist.

Schritt 1. Melden Sie sich bei Azure an, und authentifizieren Sie sich bei Bedarf.

az login

Schritt 2. Installieren oder aktualisieren Sie die Erweiterung für Azure-Container-Apps mit az-Erweiterungs-Add-Befehl .

az extension add --name containerapp --upgrade

Schritt 3. Erstellen Sie eine Container-Apps-Umgebung mit dem Befehl "az containerapp env create ".

az containerapp env create \
--name python-container-env \
--resource-group pythoncontainer-rg \
--location <location>

<location> is one of the Azure location Name values from the output of the command az account list-locations -o table.

Schritt 4. Rufen Sie die Anmeldeinformationen für die Azure-Containerregistrierung ab.

az acr credential show -n <registry-name>

Verwenden Sie den Benutzernamen und eines der Kennwörter, die aus der Ausgabe des Befehls zurückgegeben werden.

Schritt 5. Erstellen Sie eine Container-App in der Umgebung mit dem Befehl "az containerapp create ".

az containerapp create \
--name python-container-app \
--resource-group pythoncontainer-rg \
--image <registry-name>.azurecr.io/pythoncontainer:latest \
--environment python-container-env \
--ingress external \
--target-port 8000 \
--registry-server <registry-name>.azurecr.io \
--registry-username <registry-username> \
--registry-password <registry-password> \
--env-vars <env-variable-string>
--query properties.configuration.ingress.fqdn

<env-variable-string ist eine Zeichenfolge> , die aus durch Leerzeichen getrennten Werten im Key="value"-Format mit den folgenden Werten besteht.

  • AZURE_POSTGRESQL_HOST=<postgres-server-name.postgres.database.azure.com>
  • AZURE_POSTGRESQL_DATABASE=restaurants_reviews
  • AZURE_POSTGRESQL_USERNAME=demoadmin
  • AZURE_POSTGRESQL_PASSWORD=<db-password>
  • RUNNING_IN_PRODUCTION=1
  • AZURE_SECRET_KEY=<IHR GEHEIMER SCHLÜSSEL>

Generieren Eines AZURE_SECRET_KEY Werts mithilfe der Ausgabe von python -c 'import secrets; print(secrets.token_hex())'.

Hier ist ein Beispiel: --env-vars AZURE_POSTGRESQL_HOST="my-postgres-server.postgres.database.azure.com" AZURE_POSTGRESQL_DATABASE="restaurants_reviews" AZURE_POSTGRESQL_USERNAME="demoadmin" AZURE_POSTGRESQL_PASSWORD="somepassword" RUNNING_IN_PRODUCTION="1" AZURE_SECRET_KEY=asdfasdfasdf.

Schritt 7. Migrieren und erstellen Sie datenbankschemas nur für Django. (In der Flask-Beispiel-App wird sie automatisch ausgeführt, und Sie können diesen Schritt überspringen.)

Verbinden mit dem Befehl az containerapp exec:

az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg

Geben Sie dann an der Shell-Eingabeaufforderung den Text python manage.py migrateein.

Sie müssen nicht für Überarbeitungen des Containers migrieren.

Schritt 8: Testen Sie die Website.

Der az containerapp create von Ihnen eingegebene Befehl gibt eine Anwendungs-URL aus, mit der Sie zur App navigieren können. Die URL endet mit "azurecontainerapps.io". Navigieren Sie zu der URL in einem Browser. Alternativ können Sie den Befehl "az containerapp browse" verwenden.

Hier ist ein Beispiel für die Beispielwebsite nach dem Hinzufügen eines Restaurants und zwei Bewertungen.

Screenshot showing an example of the sample website built in this tutorial.

Problembehandlung bei der Bereitstellung

  • Sie haben die Anwendungs-URL vergessen, um auf die Website zuzugreifen.

    • Wechseln Sie im Azure-Portal zur Seite "Übersicht" der Container-App, und suchen Sie nach der Anwendungs-URL.
    • Wechseln Sie in VS Code zur Azure-Erweiterung, und wählen Sie den Abschnitt "Container-Apps " aus. Erweitern Sie das Abonnement, erweitern Sie die Containerumgebung, und wenn Sie die Container-App finden, klicken Sie mit der rechten Maustaste auf python-container-app, und wählen Sie "Durchsuchen" aus.
    • Verwenden Sie mit Azure CLI den Befehl az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn.
  • In VS Code gibt das Buildimage in Azure-Aufgabe einen Fehler zurück.

    • Wenn die Meldung "Fehler: Fehler beim Herunterladen des Kontexts angezeigt wird. Überprüfen Sie, ob die URL falsch ist." aktualisieren Sie dann die Registrierung in der Docker-Erweiterung im Fenster "VS-Codeausgabe". Um die Erweiterung zu aktualisieren, wählen Sie die Docker-Erweiterung aus, wechseln Sie zum Abschnitt "Registrierungen", suchen Sie die Registrierung, und wählen Sie sie aus.
    • Wenn Sie das Buildimage in Azure-Aufgabe erneut ausführen, überprüfen Sie, ob Ihre Registrierung aus einer vorherigen Ausführung vorhanden ist, und verwenden Sie es.
  • Im Azure-Portal während der Erstellung einer Container-App wird ein Zugriffsfehler angezeigt, der "Name.azurecr.io<>" enthält.

    • Dieser Fehler tritt auf, wenn Administratoranmeldeinformationen für die ACR deaktiviert sind. Um den Administratorstatus im Portal zu überprüfen, wechseln Sie zu Ihrer Azure-Containerregistrierung, wählen Sie die Ressource für Zugriffstasten aus, und stellen Sie sicher, dass der Administratorbenutzer aktiviert ist.
  • Ihr Containerimage wird nicht in der Azure-Containerregistrierung angezeigt.

    • Überprüfen Sie die Ausgabe des Azure CLI-Befehls oder der VS-Codeausgabe, und suchen Sie nach Nachrichten, um den Erfolg zu bestätigen.
    • Vergewissern Sie sich, dass der Name der Registrierung in Ihrem Buildbefehl mit der Azure CLI oder in den Taskaufforderungen von VS Code richtig angegeben wurde.
    • Stellen Sie sicher, dass Ihre Anmeldeinformationen nicht abgelaufen sind. Suchen Sie z. B. in VS Code die Zielregistrierung in der Docker-Erweiterung, und aktualisieren Sie sie. Führen Sie in Azure CLI aus az login.
  • Die Website gibt "Bad Request (400)" zurück.

    • Überprüfen Sie die an den Container übergebenen PostgreSQL-Umgebungsvariablen. Der Fehler 400 weist häufig darauf hin, dass der Python-Code keine Verbindung mit der PostgreSQL-Instanz herstellen kann.
    • Der in diesem Lernprogramm verwendete Beispielcode sucht nach dem Vorhandensein der Containerumgebungsvariablen RUNNING_IN_PRODUCTION, die auf einen beliebigen Wert wie "1" festgelegt werden kann.
  • Die Website gibt "Nicht gefunden (404)" zurück.

    • Überprüfen Sie die Anwendungs-URL auf der Übersichtsseite für den Container. Wenn die Anwendungs-URL das Wort "internal" enthält, wird der Eingangsschritt nicht ordnungsgemäß festgelegt.
    • Überprüfen Sie den Eingangs des Containers. Wechseln Sie z. B. in Azure-Portal zur Ingress-Ressource des Containers, und stellen Sie sicher, dass "HTTP-Eingangs" aktiviert ist und der Datenverkehr von überall aus akzeptiert wird.
  • Die Website wird nicht gestartet, es wird "Streamtimeout" angezeigt, oder es wird nichts zurückgegeben.

    • Überprüfen Sie die Protokolle.
      • Wechseln Sie im Azure-Portal zur Revisionsverwaltungsressource der Container-App, und überprüfen Sie den Bereitstellungsstatus des Containers.
        • Wenn "Bereitstellung" ausgeführt wird, warten Sie, bis die Bereitstellung abgeschlossen ist.
        • Wenn "Fehlgeschlagen" ist, wählen Sie die Überarbeitung aus, und zeigen Sie die Konsolenprotokolle an. Wählen Sie die Reihenfolge der Spalten aus, um "Zeit generiert", "Stream_s" und "Log_s" anzuzeigen. Sortieren Sie die Protokolle nach der neuesten ersten Und suchen Sie nach Python-Stderr- und Stdout-Nachrichten in der Spalte "Stream_s". Die Python-Ausgabe "print" ist stdout-Nachrichten .
      • Verwenden Sie mit der Azure CLI den Befehl "az containerapp logs show ".
    • Wenn Sie das Django-Framework verwenden, überprüfen Sie, ob die restaurants_reviews Tabellen in der Datenbank vorhanden sind. Verwenden Sie andernfalls eine Konsole, um auf den Container zuzugreifen und auszuführen python manage.py migrate.

Nächster Schritt