Dela via


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.

En skärmbild av tjänsterna i självstudien – Distribuera en Python-app i Azure Container Apps. Avsnittet som är markerat är det som beskrivs i den här artikeln.

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 du az 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 migratefö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.

Skärmbild som visar ett exempel på exempelwebbplatsen som skapats i den här självstudien.

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:ensidan Ö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 .
    • 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.

Gå vidare