Erstellen und Bereitstellen einer Python-Web-App mit Azure Container Apps und PostgreSQL
Dieser Artikel ist Teil eines Tutorials über die Containerisierung und Bereitstellung einer Python-Web-App in Azure Container Apps. Mit Container Apps können Sie containerisierte Aps bereitstellen, ohne eine komplexe Infrastruktur verwalten zu müssen.
In diesem Teil des Tutorials lernen Sie, wie Sie eine Python-Beispiel-Web-App (Django oder Flask) containerisieren und bereitstellen. Genauer gesagt, Sie erstellen das Container-Image in der Cloud und stellen es in Azure Container Apps bereit. Sie definieren Umgebungsvariablen, die es der Container-Apps ermöglichen, sich mit einer Azure Database for PostgreSQL – Flexible Server-Instanz zu verbinden, in der die Beispiel-App Daten speichert.
Dieses Service-Diagramm hebt die Komponenten hervor, die in diesem Artikel behandelt werden: Erstellen und Bereitstellen eines Container-Images.
Abrufen der Beispiel-App
Forken und klonen Sie den Beispielcode in Ihrer Entwicklungsumgebung.
Schritt 1. Gehen Sie zum GitHub-Repository der Beispiel-App (Django oder Flask) und wählen Sie Fork.
Folgen Sie den Schritten, um das Verzeichnis zu Ihrem GitHub-Konto zu forken. Sie können das Code-Repository auch direkt auf Ihren lokalen Rechner herunterladen, ohne es zu forken oder ein GitHub-Konto einzurichten. Allerdings können Sie dann nicht das später im Tutorial beschriebene CI/CD einrichten.
Schritt 2. Verwenden Sie den Befehl git clone, um das geforkte 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. Wechseln Sie das Verzeichnis.
cd python-container
Erstellen Sie ein Container-Image aus dem Code einer Web-App
Nachdem Sie diese Schritte ausgeführt haben, verfügen Sie über eine Azure Container Registry, die ein aus dem Beispielcode erstelltes Docker-Container-Image 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. Erstellen Sie mithilfe des Befehls az group create eine Ressourcengruppe.
az group create \
--name pythoncontainer-rg \
--location <location>
<Ort> ist einer der Namenswerte des Azure-Speicherortes aus der Ausgabe des Befehls az account list-locations -o table
.
Schritt 2. Erstellen Sie eine Container-Registrierung mit dem Befehl az acr create.
az acr create \
--resource-group pythoncontainer-rg \
--name <registry-name> \
--sku Basic \
--admin-enabled
<Registrierungsname> muss innerhalb von Azure eindeutig sein und 5–50 alphanumerische Zeichen enthalten.
Sie können die für Administrierende erstellten Anmeldeinformationen mit anzeigen:
az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg
Schritt 3. Melden Sie sich mit dem Befehl az acr login bei der Registrierung an.
az acr login --name <registry-name>
Der Befehl fügt „azurecr.io“ an den Namen an, um den voll qualifizierten Registrierungsnamen zu erstellen. Wenn die Anmeldung erfolgreich war, sehen Sie die Meldung „Login Succeeded“ (Anmeldung erfolgreich). Wenn Sie auf die Registrierung von einem anderen Abonnement aus zugreifen als dem, in dem die Registrierung erstellt wurde, verwenden Sie den Schalter „--suffix
“.
Schritt 4. Erstellen Sie das Image mit dem Befehl az acr build.
az acr build \
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .
Beachten Sie dabei Folgendes:
Der Punkt („.“) am Ende des Befehls gibt an, wo sich der zu erstellende Quellcode befindet. Wenn Sie diesen Befehl nicht im Stammverzeichnis der Beispiel-App ausführen, geben Sie den Pfad zu dem Code an.
Wenn Sie den Befehl in Azure Cloud Shell ausführen, verwenden Sie „
git clone
“, um zunächst das Repo in die Cloud Shell-Umgebung zu ziehen und das Verzeichnis in das Stammverzeichnis des Projekts zu ändern, damit der Punkt („.“) korrekt interpretiert wird.Wenn Sie die Option „
-t
“ (wie „--image
“) weglassen, stellt der Befehl einen lokalen Kontext-Build in die Warteschlange, ohne ihn in die Registrierung zu stellen. Erstellen ohne Pushen kann nützlich sein, um zu überprüfen, ob das Image erstellt wird.
Schritt 5. Bestätigen Sie, dass das Container-Image erstellt wurde mit dem Befehl az acr repository list.
az acr repository list --name <registry-name>
Erstellen Sie eine PostgreSQL Flexible Server-Instanz
Die Beispiel-App (Django oder Flask) speichert Daten zu Restaurantbewertungen in einer PostgreSQL-Datenbank. In diesen Schritten erstellen Sie den Server, der die Datenbank enthalten wird.
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 flexible-server create, um den PostgreSQL-Server in Azure zu erstellen. Es ist nicht ungewöhnlich, dass es einige Minuten dauert, bis dieser Befehl 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 Name der Ressourcengruppe, die in diesem Tutorial verwendet wird. Wenn Sie einen anderen Namen verwendet haben, ändern Sie diesen Wert.
<postgres-server-name> → Der Name des PostgreSQL-Datenbankservers. Dieser Name muss einzigartig für alle Azure sein. Der Server-Endpunkt lautet „https://<postgres-server-name>.postgres.database.azure.com“. Erlaubte Zeichen sind „A“–“Z“, „0“–„9“ und „–“.
<location>: Verwenden Sie den gleichen Standort wie für die Web-App. <Ort> ist einer der Namenswerte des Azure-Speicherortes aus der Ausgabe des Befehls
az account list-locations -o table
.<admin-username> → Benutzername für das Administratorkonto. Er kann nicht „azure_superuser“, „admin“, „administrator“, „root“, „guest“ oder „public“ sein. Verwenden Sie für dieses Tutorial „demoadmin“.
<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
Verwenden Sie beim Erstellen von Benutzernamen oder Kennwörtern nicht das Zeichen „$“. Später erstellen Sie Umgebungsvariablen mit diesen Werten, wobei das Zeichen „$“ innerhalb des Linux-Containers, der zur Ausführung von Python-Apps verwendet wird, eine besondere Bedeutung hat.
<sku-name>
→ Der Name der Preisstufe und der Berechnungskonfiguration, z. B. „Standard_D2s_v3“. Weitere Informationen finden Sie unter Azure Database for PostgreSQL – Preise. Um die verfügbaren SKUs aufzulisten, verwenden Sieaz postgres flexible-server list-skus --location <location>
.<public-access>
→ Verwenden Sie „0.0.0.0“, was den öffentlichen Zugriff auf den Server von jedem Azure-Dienst aus ermöglicht, z. B. Container Apps.
Hinweis
Wenn Sie vorhaben, den PostgreSQL-Server von Ihrer lokalen Workstation aus mit anderen Tools als Azure CLI zu bedienen, müssen Sie mit dem Befehl az postgres flexible-server firewall-rule create eine Firewallregel hinzufügen.
Erstellen Sie eine Datenbank auf dem Server
Zu diesem Zeitpunkt haben Sie einen PostgreSQL-Server. In diesem Abschnitt erstellen Sie eine Datenbank auf dem Server.
Sie können das interaktive PostgreSQL-Terminal psql in Ihrer lokalen Umgebung oder in der Azure Cloud Shellverwenden, die auch über das Azure-Portalzugänglich ist. Wenn Sie mit psql arbeiten, ist es oft einfacher, die Cloud Shell zu verwenden, da alle Abhängigkeiten für Sie in der Shell enthalten sind.
Schritt 1. Stellen Sie mit psql eine Verbindung zur Datenbank her.
psql --host=<postgres-server-name>.postgres.database.azure.com \
--port=5432 \
--username=demoadmin@<postgres-server-name> \
--dbname=postgres
Dabei ist <postgres-server-name> der Name des PostgreSQL-Servers. Der Befehl fordert Sie zur Eingabe des Administrator-Kennworts auf.
Wenn Sie Probleme beim Herstellen der Verbindung haben, starten Sie die Datenbank neu, und versuchen Sie es noch mal. Wenn Sie die Verbindung von Ihrer lokalen Umgebung aus herstellen, muss Ihre IP-Adresse zur Liste der Firewall-Regeln für den Datenbankdienst hinzugefügt werden.
Schritt 2. Erstellen Sie die Datenbank.
Geben Sie an der Eingabeaufforderung postgres=>
ein:
CREATE DATABASE restaurants_reviews;
Das Semikolon („;“) am Ende des Befehls ist notwendig. Um zu überprüfen, ob die Datenbank erfolgreich erstellt wurde, verwenden Sie den Befehl „\c restaurants_reviews
“. Geben Sie \?
ein, um die Hilfe anzuzeigen, oder \q
, um den Vorgang zu beenden.
Sie können auch eine Verbindung zum Azure PostgreSQL Flexible Server herstellen und eine Datenbank mit Azure Data Studio oder einer anderen IDE, die PostgreSQL unterstützt, erstellen.
Stellen Sie die Web-App in Container Apps bereit
Container-Apps werden in Container-Apps Umgebungen bereitgestellt, die als sichere Grenze dienen. In den folgenden Schritten erstellen Sie die Umgebung, einen Container innerhalb der Umgebung und konfigurieren den Container so, dass die Website nach außen sichtbar ist.
Schritt 1. Melden Sie sich bei Azure an und authentifizieren Sie sich, falls erforderlich.
az login
Schritt 2. Installieren oder aktualisieren Sie die Erweiterung für Azure Container Apps mit dem Befehl az extension add.
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>
<Ort> ist einer der Namenswerte des Azure-Speicherortes aus der Ausgabe des Befehls az account list-locations -o table
.
Schritt 4. Holen Sie sich die Anmeldedaten für die Azure Container Registry.
az acr credential show -n <registry-name>
Verwenden Sie den Benutzernamen und eines der Kennwörter, die in der Ausgabe des Befehls enthalten sind.
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 Zeichenkette, die aus durch Leerzeichen getrennten Werten im Format key="value" 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>
Erzeugen Sie den Wert AZURE_SECRET_KEY
anhand der Ausgabe von python -c 'import secrets; print(secrets.token_hex())'
.
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. Nur für Django: Migrieren und erstellen Sie das Datenbankschema. (In der Flask-Beispiel-App geschieht dies automatisch, so dass Sie diesen Schritt überspringen können).
Verbinden Sie sich mit dem Befehl az containerapp exec:
az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg
Geben Sie dann an der Shell-Eingabeaufforderung „python manage.py migrate
“ ein.
Für Revisionen des Containers brauchen Sie nicht zu migrieren.
Schritt 8: Testen Sie die Website.
Der Befehl „az containerapp create
“, den Sie zuvor eingegeben haben, gibt eine Anwendungs-URL aus, die Sie verwenden können, um die App aufzurufen. Die URL endet auf „azurecontainerapps.io“. Rufen Sie die URL in einem Browser auf. Alternativ können Sie auch den Befehl az containerapp browse verwenden.
Hier sehen Sie ein Beispiel für die Beispiel-Website, nachdem Sie ein Restaurant und zwei Bewertungen hinzugefügt haben.
Problembehandlung bei der Bereitstellung
Sie haben die Anwendungs-URL für den Zugriff auf die Website vergessen.
- Gehen Sie im Azure-Portal auf die Seite Übersicht der Container-App und suchen Sie nach der Anwendungs-URL.
- Wechseln Sie in VS Code in die Azure-Ansicht (Strg+Umschalt+A) und erweitern Sie das Abonnement, in dem Sie gerade arbeiten. Erweitern Sie den Knoten Container Apps, erweitern Sie dann die verwaltete Umgebung und klicken Sie mit der rechten Maustaste auf python-container-app und wählen Sie Durchsuchen. Es öffnet den Browser mit der Anwendungs-URL.
- 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 die Aufgabe Image in Azure erstellen einen Fehler zurück.
- Wenn Sie die Meldung „Fehler: Kontext kann nicht heruntergeladen werden. Bitte überprüfen Sie, ob die URL falsch ist.“ im Fenster VS Code-Ausgabe, dann aktualisieren Sie die Registrierung in der Docker-Erweiterung. Zum Aktualisieren wählen Sie die Docker-Erweiterung, gehen zum Abschnitt „Registrierungen“, suchen die Registrierung und wählen sie aus.
- Wenn Sie die Aufgabe Image in Azure erstellen erneut ausführen, prüfen Sie, ob Ihre Registrierung aus einem früheren Lauf noch vorhanden ist und verwenden Sie sie gegebenenfalls.
Im Azure-Portal sehen Sie während der Erstellung einer Container-App einen Zugriffsfehler mit dem Inhalt „Cannot access ACR '<name>.azurecr.io'“.
- Dieser Fehler tritt auf, wenn die Admin-Anmeldedaten auf dem ACR deaktiviert sind. Um den Admin-Status im Portal zu überprüfen, gehen Sie zu Ihrer Azure Container Registry, wählen Sie die Ressource Zugriffsschlüssel und stellen Sie sicher, dass Administratorbenutzer aktiviert ist.
Ihr Container-Image wird nicht in der Azure Container Registry angezeigt.
- Überprüfen Sie die Ausgabe des Azure CLI-Befehls oder die VS Code-Ausgabe und suchen Sie nach Meldungen, die den Erfolg bestätigen.
- Überprüfen Sie, ob der Name der Registrierung in Ihrem Build-Befehl mit der Azure CLI oder in den Aufgabenaufforderungen von VS Code korrekt angegeben wurde.
- Vergewissern Sie sich, dass Ihre Berechtigungsnachweise nicht abgelaufen sind. Suchen Sie zum Beispiel in VS Code die Zielregistrierung in der Docker-Erweiterung und aktualisieren Sie sie. Führen Sie in Azure CLI „
az login
“ aus.
Die Website gibt „Bad Request (400)“ zurück.
- Überprüfen Sie die an den Container übergebenen PostgreSQL-Umgebungsvariablen. Der 400-Fehler zeigt oft an, dass der Python-Code keine Verbindung zur PostgreSQL-Instanz herstellen kann.
- Der in diesem Tutorial verwendete Beispielcode überprüft die Existenz der Container-Umgebungsvariable
RUNNING_IN_PRODUCTION
, die auf einen beliebigen Wert wie „1“ gesetzt werden kann.
Die Website gibt „Nicht gefunden (404)“ zurück.
- Prüfen Sie die Anwendungs-URL auf der Seite Übersicht für den Container. Wenn die Anwendungs-Url das Wort „intern“ enthält, ist der Zugriff nicht korrekt eingestellt.
- Prüfen Sie das Eindringen in den Behälter. Gehen Sie beispielsweise im Azure-Portal zur Ressource Eingehend des Containers und stellen Sie sicher, dass HTTP Ingress aktiviert ist und Datenverkehr von überall akzeptieren ausgewählt ist.
Die Website startet nicht, Sie sehen „stream timeout“ oder es wird nichts zurückgegeben.
- Überprüfen Sie die Protokolle.
- Gehen Sie im Azure-Portal zur Ressource Revisionsverwaltung der Container-App und überprüfen Sie den Bereitstellungsstatus des Containers.
- Bei „Bereitstellung“ warten Sie, bis die Bereitstellung abgeschlossen ist.
- Bei „Fehlgeschlagen“ wählen Sie die Revision aus und sehen Sie sich die Konsolenprotokolle an. Wählen Sie die Reihenfolge der Spalten für „Zeit der Generierung“, „Stream_s“ und „Log_s“. Sortieren Sie die Protokolle zuerst nach dem neuesten Stand und suchen Sie nach Python stderr und stdout Nachrichten in der Spalte „Stream_s“. Die Python „print“-Ausgabe wird stdout Nachrichten sein.
- Verwenden Sie mit der Azure CLI den Befehl az containerapp logs show.
- Gehen Sie im Azure-Portal zur Ressource Revisionsverwaltung der Container-App und überprüfen Sie den Bereitstellungsstatus des Containers.
- Wenn Sie das Django-Framework verwenden, prüfen Sie, ob die Tabellen restaurants_reviews in der Datenbank existieren. Falls nicht, verwenden Sie eine Konsole, um auf den Container zuzugreifen und führen Sie „
python manage.py migrate
“ aus.
- Überprüfen Sie die Protokolle.