Skapa och distribuera en Python-webbapp med Azure Container Apps och PostgreSQL
Den här artikeln är en del av en självstudie om hur du containeriserar och distribuerar en Python-webbapp till Azure Container Apps. Med Container Apps kan du distribuera containerbaserade appar utan att hantera komplex infrastruktur.
I den här delen av självstudien får du lära dig hur du containeriserar och distribuerar en Python-exempelwebbapp (Django eller Flask). Mer specifikt skapar du containeravbildningen i molnet och distribuerar den till Azure Container Apps. Du definierar miljövariabler som gör att containerappen kan ansluta till en Azure Database for PostgreSQL – flexibel serverinstans , där exempelappen lagrar data.
Det här tjänstdiagrammet visar de komponenter som beskrivs i den här artikeln: skapa och distribuera en containeravbildning.
Hämta exempelappen
Förgrena och klona exempelkoden till utvecklarmiljön.
Steg 1. Gå till GitHub-lagringsplatsen för exempelappen (Django eller Flask) och välj Förgrening.
Följ stegen för att förgrena katalogen till ditt GitHub-konto. Du kan också ladda ned kodlagringsplatsen direkt till din lokala dator utan förgrening eller ett GitHub-konto, men du kommer inte att kunna konfigurera CI/CD som beskrivs senare i självstudien.
Steg 2. Använd git-klonkommandot för att klona den förgrenade lagringsplatsen till mappen python-container:
# 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
Steg 3. Ändra katalog.
cd python-container
Skapa en containeravbildning från webbappskod
När du har följt de här stegen har du ett Azure Container Registry som innehåller en Docker-containeravbildning som skapats från exempelkoden.
Azure CLI-kommandon kan köras i Azure Cloud Shell eller på en arbetsstation med Azure CLI installerat.
Steg 1. Skapa en resursgrupp med kommandot az group create.
az group create \
--name pythoncontainer-rg \
--location <location>
<location> är ett av Värdena för Azure-platsnamn från utdata från kommandot az account list-locations -o table
.
Steg 2. Skapa ett containerregister med kommandot az acr create .
az acr create \
--resource-group pythoncontainer-rg \
--name <registry-name> \
--sku Basic \
--admin-enabled
<registernamn> måste vara unikt i Azure och innehålla 5–50 alfanumeriska tecken.
Du kan visa de autentiseringsuppgifter som skapats för administratören med:
az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg
Steg 3. Logga in på registret med kommandot az acr login .
az acr login --name <registry-name>
Kommandot lägger till "azurecr.io" i namnet för att skapa det fullständigt kvalificerade registernamnet. Om det lyckas visas meddelandet "Inloggningen lyckades". Om du kommer åt registret från en annan prenumeration än den där registret skapades använder du växeln --suffix
.
Steg 4. Skapa avbildningen med kommandot az acr build .
az acr build \
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .
Tänk på följande:
Punkten (".") i slutet av kommandot anger platsen för källkoden som ska skapas. Om du inte kör det här kommandot i exempelappens rotkatalog anger du sökvägen till koden.
Om du kör kommandot i Azure Cloud Shell använder
git clone
du för att först hämta lagringsplatsen till Cloud Shell-miljön först och ändra katalogen till projektets rot så att punkt (".") tolkas korrekt.Om du utelämnar
-t
alternativet (samma som--image
) köar kommandot en lokal kontextversion utan att push-överföra den till registret. Att skapa utan push-överföring kan vara användbart för att kontrollera att avbildningen skapas.
Steg 5. Bekräfta att containeravbildningen skapades med kommandot az acr repository list .
az acr repository list --name <registry-name>
Skapa en PostgreSQL– flexibel serverinstans
Exempelappen (Django eller Flask) lagrar granskningsdata för restaurangen i en PostgreSQL-databas. I de här stegen skapar du den server som ska innehålla databasen.
Azure CLI-kommandon kan köras i Azure Cloud Shell eller på en arbetsstation med Azure CLI installerat.
Steg 1. Använd kommandot az postgres flexible-server create för att skapa PostgreSQL-servern i Azure. Det är inte ovanligt att det här kommandot körs i några minuter.
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" → Resursgruppens namn som används i den här självstudien. Om du har använt ett annat namn ändrar du det här värdet.
<postgres-server-name> → PostgreSQL-databasserverns namn. Det här namnet måste vara unikt i hela Azure. Serverslutpunkten är "https://< postgres-server-name.postgres.database.azure.com>". Tillåtna tecken är "A"-"Z", "0"-"9" och "-".
<plats> → Använd samma plats som används för webbappen. <location> är ett av Värdena för Azure-platsnamn från utdata från kommandot
az account list-locations -o table
.<admin-username> → Användarnamn för administratörskontot. Det kan inte vara "azure_superuser", "admin", "administratör", "rot", "gäst" eller "offentlig". Använd "demoadmin" för den här självstudien.
<administratörslösenord> Lösenord för administratörsanvändaren. Den måste innehålla mellan 8 och 128 tecken från tre av följande kategorier: engelska versaler, engelska gemener, siffror och icke-alfanumeriska tecken.
Viktigt!
När du skapar användarnamn eller lösenord använder du inte $-tecknet. Senare skapar du miljövariabler med dessa värden där $-tecknet har särskild betydelse i Linux-containern som används för att köra Python-appar.
<sku-name>
→ Namnet på prisnivån och beräkningskonfigurationen, till exempel "Standard_D2s_v3". Mer information finns i Priser för Azure Database for PostgreSQL. Om du vill visa en lista över tillgängliga SKU:er använder duaz postgres flexible-server list-skus --location <location>
.<public-access>
→ Använd "0.0.0.0", vilket ger offentlig åtkomst till servern från valfri Azure-tjänst, till exempel Container Apps.
Kommentar
Om du planerar att arbeta med PostgreSQL-servern från din lokala arbetsstation med andra verktyg än Azure CLI måste du lägga till en brandväggsregel med kommandot az postgres flexible-server firewall-rule create .
Skapa en databas på servern
Nu har du en PostgreSQL-server. I det här avsnittet skapar du en databas på servern.
Du kan använda den interaktiva PostgreSQL-terminalen psql i din lokala miljö eller i Azure Cloud Shell, som också är tillgängligt i Azure Portal. När du arbetar med psql är det ofta enklare att använda Cloud Shell eftersom alla beroenden ingår för dig i gränssnittet.
Steg 1. Anslut till databasen med psql.
psql --host=<postgres-server-name>.postgres.database.azure.com \
--port=5432 \
--username=demoadmin@<postgres-server-name> \
--dbname=postgres
Där <postgres-server-name> är namnet på PostgreSQL-servern. Kommandot uppmanar dig att ange administratörslösenordet.
Om du har problem med att ansluta startar du om databasen och försöker igen. Om du ansluter från din lokala miljö måste DIN IP-adress läggas till i listan över brandväggsregler för databastjänsten.
Steg 2. Skapa databasen.
Vid promptens postgres=>
typ:
CREATE DATABASE restaurants_reviews;
Semikolonet (";") i slutet av kommandot är nödvändigt. Om du vill kontrollera att databasen har skapats använder du kommandot \c restaurants_reviews
. Skriv \?
för att visa hjälp eller \q
avsluta.
Du kan också ansluta till Azure PostgreSQL – flexibel server och skapa en databas med hjälp av Azure Data Studio eller någon annan IDE som stöder PostgreSQL.
Distribuera webbappen till Container Apps
Containerappar distribueras till Container Apps-miljöer som fungerar som en säker gräns. I följande steg skapar du miljön, en container i miljön och konfigurerar containern så att webbplatsen visas externt.
Steg 1. Logga in på Azure och autentisera om det behövs.
az login
Steg 2. Installera eller uppgradera tillägget för Azure Container Apps med kommandot az extension add .
az extension add --name containerapp --upgrade
Steg 3. Skapa en Container Apps-miljö med kommandot az containerapp env create .
az containerapp env create \
--name python-container-env \
--resource-group pythoncontainer-rg \
--location <location>
<location> är ett av Värdena för Azure-platsnamn från utdata från kommandot az account list-locations -o table
.
Steg 4. Hämta inloggningsuppgifterna för Azure Container Registry.
az acr credential show -n <registry-name>
Använd användarnamnet och ett av de lösenord som returneras från kommandots utdata.
Steg 5. Skapa en containerapp i miljön med kommandot 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> är en sträng som består av blankstegsavgränsade värden i formatet key="value" med följande värden.
- 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=<YOUR-SECRET-KEY>
Generera AZURE_SECRET_KEY
värde med hjälp av utdata från python -c 'import secrets; print(secrets.token_hex())'
.
Här följer ett exempel: --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
.
Steg 7. Endast för Django migrerar och skapar du databasschema. (I Flask-exempelappen görs den automatiskt och du kan hoppa över det här steget.)
Anslut med kommandot az containerapp exec :
az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg
Skriv sedan vid kommandotolken python manage.py migrate
för gränssnittet .
Du behöver inte migrera för revisioner av containern.
Steg 8. Testa webbplatsen.
Kommandot az containerapp create
som du angav tidigare matar ut en program-URL som du kan använda för att bläddra till appen. URL:en slutar med "azurecontainerapps.io". Gå till URL:en i en webbläsare. Du kan också använda kommandot az containerapp browse .
Här är ett exempel på exempelwebbplatsen när du har lagt till en restaurang och två recensioner.
Felsöka distribution
Du har glömt program-URL:en för att komma åt webbplatsen.
- I Azure Portal går du till sidan Översikt i containerappen och letar efter program-URL:en.
- I VS Code går du till Azure-vyn (Ctrl+Skift+A) och expanderar prenumerationen som du arbetar i. Expandera noden Container Apps, expandera sedan den hanterade miljön och högerklicka på python-container-app och välj Bläddra. Webbläsaren öppnas med program-URL:en.
- Använd kommandot
az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn
i Azure CLI.
I VS Code returnerar uppgiften Skapa avbildning i Azure ett fel.
- Om du ser meddelandet "Fel: det gick inte att ladda ned kontexten. Kontrollera om URL:en är felaktig." i VS Code-utdatafönstret och uppdatera sedan registret i Docker-tillägget. Om du vill uppdatera väljer du Docker-tillägget, går till avsnittet Registries, letar upp registret och väljer det.
- Om du kör uppgiften Skapa avbildning i Azure igen kontrollerar du om registret från en tidigare körning finns och i så fall använder du det.
I Azure Portal när en containerapp skapas visas ett åtkomstfel som innehåller "Det går inte att komma åt ACR '<name.azurecr.io>'".
- Det här felet uppstår när administratörsautentiseringsuppgifterna för ACR är inaktiverade. Om du vill kontrollera administratörsstatusen i portalen går du till Azure Container Registry, väljer resursen Åtkomstnycklar och kontrollerar att administratörsanvändaren är aktiverad.
Containeravbildningen visas inte i Azure Container Registry.
- Kontrollera utdata från Azure CLI-kommandot eller VS Code-utdata och leta efter meddelanden för att bekräfta att det lyckades.
- Kontrollera att namnet på registret har angetts korrekt i byggkommandot med Azure CLI eller i uppgiftsprompterna för VS Code.
- Kontrollera att dina autentiseringsuppgifter inte har upphört att gälla. I VS Code hittar du till exempel målregistret i Docker-tillägget och uppdaterar. Kör i Azure CLI
az login
.
Webbplatsen returnerar "Felaktig begäran (400)".
- Kontrollera de PostgreSQL-miljövariabler som skickas till containern. 400-felet anger ofta att Python-koden inte kan ansluta till PostgreSQL-instansen.
- Exempelkoden som används i den här självstudien söker efter förekomsten av containermiljövariabeln
RUNNING_IN_PRODUCTION
, som kan anges till valfritt värde som "1".
Webbplatsen returnerar "Hittades inte (404)".
- Kontrollera program-URL:en på sidan Översikt för containern. Om program-URL:en innehåller ordet "intern" är ingressen inte korrekt inställd.
- Kontrollera containerns ingress. I Azure Portal går du till containerns ingressresurs och kontrollerar att HTTP-ingress är aktiverat och Att acceptera trafik var som helst har valts.
Webbplatsen startar inte, du ser "stream timeout" eller så returneras ingenting.
- Kontrollera loggarna.
- I Azure Portal går du till containerappens revisionshanteringsresurs och kontrollerar containerns etableringsstatus.
- Om "Etablering" väntar du tills etableringen har slutförts.
- Om "Misslyckades" väljer du revisionen och visar konsolloggarna. Välj ordningen på kolumnerna för att visa "Time Generated", "Stream_s" och "Log_s". Sortera loggarna efter de senaste först och leta efter Python stderr - och stdout-meddelanden i kolumnen "Stream_s". Utdata från Python "print" kommer att vara stdout-meddelanden .
- Med Azure CLI använder du kommandot az containerapp logs show .
- I Azure Portal går du till containerappens revisionshanteringsresurs och kontrollerar containerns etableringsstatus.
- Om du använder Django-ramverket kontrollerar du om det finns restaurants_reviews tabeller i databasen. Om inte använder du en konsol för att komma åt containern och köra
python manage.py migrate
.
- Kontrollera loggarna.