Dela via


Självstudie: Skapa och distribuera en Python-webbapp med Azure Container Apps och PostgreSQL

Den här artikeln är del av en självstudieserie 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 handledningen:

  • Containerisera en Python-exempelwebbapp (Django eller Flask) genom att skapa en containeravbildning i molnet.
  • Distribuera containeravbildningen till Azure Container Apps.
  • Definiera miljövariabler som gör att containerappen kan ansluta till en Azure Database for PostgreSQL – flexibel server instans där exempelappen lagrar data.

Följande diagram visar uppgifterna i den här handledningen: bygga och distribuera en containeravbildning.

Diagram över tjänster som ingår i distributionen av en Python-app i Azure Container Apps, där delarna om att skapa en avbildning är markerade manuellt.

Förutsättningar

Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

Du kan köra Azure CLI-kommandon i Azure Cloud Shell- eller på en arbetsstation med Azure CLI- installerat.

Om du kör lokalt följer du de här stegen för att logga in och installera de moduler som krävs för den här självstudien:

  1. Logga in på Azure och autentisera om det behövs:

    az login
    
  2. Kontrollera att du kör den senaste versionen av Azure CLI:

    az upgrade
    
  3. Installera eller uppgradera containerappen och rdbms-connect Azure CLI-tillägg med hjälp av kommandot az extension add:

    az extension add --name containerapp --upgrade
    az extension add --name rdbms-connect --upgrade
    

    Kommentar

    Om du vill visa en lista över de tillägg som är installerade i systemet kan du använda kommandot az extension list. Till exempel:

    az extension list --query [].name --output tsv
    

Hämta exempelappen

Förgrena och klona exempelkoden till utvecklarmiljön:

  1. Gå till GitHub-lagringsplatsen för exempelappen (Django eller Flask) och välj Förgrening.

    Följ stegen för att förgrena lagringsplatsen till ditt GitHub-konto. Du kan också ladda ned kodlagringsplatsen direkt till din lokala dator utan förgrening eller ett GitHub-konto. Men om du använder nedladdningsmetoden kan du inte konfigurera kontinuerlig integrering och kontinuerlig leverans (CI/CD) i nästa självstudie i den här serien.

  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
    
  3. Ändra katalogen:

    cd python-container
    

Skapa en containeravbildning från webbappskod

När du har följt de här stegen har du en Azure Container Registry-instans som innehåller en Docker-containeravbildning som skapats från exempelkoden.

  1. Skapa en resursgrupp genom att använda kommandot az group create:

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

    Ersätt <plats> med något av Azure-platsens Name värden från utdata från kommandot az account list-locations -o table.

  2. Skapa ett containerregister med hjälp av kommandot az acr create:

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

    Namnet som du använder för <registernamn> måste vara unikt i Azure och måste innehålla 5 till 50 alfanumeriska tecken.

  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 inloggningen lyckas visas meddelandet "Inloggningen lyckades". Om du kommer åt registret från en prenumeration som skiljer sig från den som du skapade registret i använder du växeln --suffix.

    Om inloggningen misslyckas kontrollerar du att Docker-daemonen körs i systemet.

  4. Skapa avbildningen med hjälp av kommandot az acr build:

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

    Dessa överväganden gäller:

    • 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 du git clone för att först hämta lagringsplatsen till Cloud Shell-miljön. Ändra sedan katalogen till projektets rot så att punkten (.) 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.

  5. Bekräfta att containeravbildningen skapades med hjälp av kommandot az acr repository list.

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

Kommentar

Stegen i det här avsnittet skapar ett containerregister på basic-tjänstnivån. Den här nivån är kostnadsoptimerad med en funktionsuppsättning och ett dataflöde som är avsett för utvecklarscenarier och är lämplig för kraven i den här självstudien. I produktionsscenarier använder du förmodligen antingen standard- eller Premium-tjänstnivån. Dessa nivåer ger förbättrade nivåer av lagring och dataflöde.

Mer information finns i Azure Container Registry-tjänstnivåer. För mer information om priser, se Azure Container Registry-priser.

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.

  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 innan det är klart.

    az postgres flexible-server create \
       --resource-group pythoncontainer-rg \
       --name <postgres-server-name>  \
       --location <location> \
       --admin-user demoadmin \
       --admin-password <admin-password> \
       --active-directory-auth Enabled \
       --tier burstable \
       --sku-name standard_b1ms \
       --public-access 0.0.0.0 
    

    Använd följande värden:

    • 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-databasservernamnet. Det här namnet måste vara unikt i hela Azure. Serverslutpunkten är https://<postgres-server-name>.postgres.database.azure.com. Tillåtna tecken AZ, 0 till 9och bindestreck (-).

    • <plats>: Använd samma plats som du använde för webbappen. <plats> är ett av Azure-platsens Name värden från resultatet av kommandot az account list-locations -o table.

    • <admin-username>: Användarnamnet för administratörskontot. Det kan inte vara azure_superuser, admin, administrator, root, guesteller public. Använd demoadmin för den här handledningen.

    • <administratörslösenord>: Administratörsanvändarens lösenord. 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änd inte dollartecknet ($). När du senare skapar miljövariabler med dessa värden har det tecknet en särskild betydelse i Den Linux-container som du använder för att köra Python-appar.

    • --active-directory-auth: Det här värdet anger om Microsoft Entra-autentisering är aktiverat på PostgreSQL-servern. Ställ in den på Enabled.

    • --sku-name: Namnet på prisnivån och beräkningskonfigurationen. till exempel Standard_B1ms. Mer information finns i Priser för Azure Database for PostgreSQL. Om du vill visa tillgängliga nivåer använder du az postgres flexible-server list-skus --location <location>.

    • --public-access: Använd 0.0.0.0. Det 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 hjälp av verktyg måste du lägga till en brandväggsregel för arbetsstationens IP-adress med hjälp av kommandot az postgres flexible-server firewall-rule create.

  2. Använd kommandot az ad signed-in-user show för att hämta objekt-ID:t för ditt användarkonto. Du använder det här ID:t i nästa kommando.

    az ad signed-in-user show --query id --output tsv
    
  3. Använd kommandot az postgres flexible-server ad-admin create för att lägga till ditt användarkonto som Microsoft Entra-administratör på PostgreSQL-servern:

    az postgres flexible-server ad-admin create \
       --resource-group pythoncontainer-rg \
       --server-name <postgres-server-name>  \
       --display-name <your-email-address> \
       --object-id <your-account-object-id>
    

    För ditt kontoobjekt-ID använder du det värde som du fick i föregående steg.

Kommentar

Stegen i det här avsnittet skapar en PostgreSQL-server med en enda virtuell kärna och begränsat minne på prisnivån Burstable. Nivån Burstable är ett billigare alternativ för arbetsbelastningar som inte behöver hela processorn kontinuerligt och som är lämplig för kraven i den här självstudien. För produktionsbelastningar kan du uppgradera till antingen prisnivån Allmänt bruk eller Minnesoptimerad. Dessa nivåer ger högre prestanda men ökar kostnaderna.

Mer information finns i Beräkningsalternativ i Azure Database for PostgreSQL – flexibel server. Information om priser finns i Prissättning för Azure Database for PostgreSQL.

Skapa en databas på servern

Nu har du en PostgreSQL-server. I det här avsnittet skapar du en databas på servern.

Använd kommandot az postgres flexible-server db create för att skapa en databas med namnet restaurants_reviews:

az postgres flexible-server db create \
   --resource-group pythoncontainer-rg \
   --server-name <postgres-server-name> \
   --database-name restaurants_reviews

Använd följande värden:

  • 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>: Namnet på PostgreSQL-servern.

Du kan också använda kommandot az postgres flexible-server connect för att ansluta till databasen och sedan arbeta med psql-kommandon . När du arbetar med psql är det ofta enklare att använda Azure Cloud Shell- eftersom gränssnittet innehåller alla beroenden åt dig.

Du kan också ansluta till den flexibla Servern Azure Database for PostgreSQL och skapa en databas med hjälp av psql eller en IDE som stöder PostgreSQL, till exempel Azure Data Studio. Anvisningar om hur du använder psql finns i Konfigurera den hanterade identiteten på PostgreSQL-databasen senare i den här artikeln.

Skapa en användartilldelad hanterad identitet

Skapa en användartilldelad hanterad identitet som ska användas som identitet för containerappen när den körs i Azure.

Kommentar

För att skapa en användartilldelad hanterad identitet behöver ditt konto hanterad identitetsdeltagare rolltilldelning.

Använd kommandot az identity create för att skapa en användartilldelad hanterad identitet:

az identity create --name my-ua-managed-id --resource-group pythoncontainer-rg

Konfigurera den hanterade identiteten i PostgreSQL-databasen

Konfigurera den hanterade identiteten som en roll på PostgreSQL-servern och ge den sedan nödvändiga behörigheter för restaurants_reviews-databasen. Oavsett om du använder Azure CLI eller psql måste du ansluta till Azure PostgreSQL-servern med en användare som har konfigurerats som Microsoft Entra-administratör på din serverinstans. Endast Microsoft Entra-konton som konfigurerats som PostgreSQL-administratör kan konfigurera hanterade identiteter och andra Microsoft-administratörsroller på servern.

  1. Hämta en åtkomsttoken för ditt Azure-konto med hjälp av kommandot az account get-access-token. Du använder åtkomsttoken i nästa steg.

    az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken
    

    Den returnerade beteckningen är lång. Ange dess värde i en miljövariabel som ska användas i kommandona i nästa steg:

    MY_ACCESS_TOKEN=<your-access-token>
    
  2. Lägg till den hanterade identiteten tilldelad av användaren som en databasroll på din PostgreSQL-server genom att använda kommandot az postgres flexible-server execute.

    az postgres flexible-server execute \
        --name <postgres-server-name> \
        --database-name postgres \
        --querytext "select * from pgaadauth_create_principal('"my-ua-managed-id"', false, false);select * from pgaadauth_list_principals(false);" \
        --admin-user <your-Azure-account-email> \
        --admin-password $MY_ACCESS_TOKEN
    

    Använd följande värden:

    • Om du använde ett annat namn för din hanterade identitet ersätter du my-ua-managed-id i kommandot pgaadauth_create_principal med namnet på din hanterade identitet.

    • För värdet --admin-user använder du e-postadressen för ditt Azure-konto.

    • För värdet --admin-password använder du åtkomsttoken från utdata från föregående kommando, utan citattecken.

    • Kontrollera att databasnamnet är postgres.

    Kommentar

    Om du kör kommandot az postgres flexible-server execute på den lokala arbetsstationen kontrollerar du att du har lagt till en brandväggsregel för arbetsstationens IP-adress. Du kan lägga till en regel med hjälp av kommandot az postgres flexible-server firewall-rule create. Samma krav finns också för kommandot i nästa steg.

  3. Ge den användartilldelade hanterade identiteten nödvändiga behörigheter för restaurants_reviews-databasen med hjälp av följande kommandot az postgres flexible-server execute:

    az postgres flexible-server execute \
        --name <postgres-server-name> \
        --database-name restaurants_reviews \
        --querytext "GRANT CONNECT ON DATABASE restaurants_reviews TO \"my-ua-managed-id\";GRANT USAGE ON SCHEMA public TO \"my-ua-managed-id\";GRANT CREATE ON SCHEMA public TO \"my-ua-managed-id\";GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"my-ua-managed-id\";ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO \"my-ua-managed-id\";" \
        --admin-user <your-Azure-account-email> \
        --admin-password $MY_ACCESS_TOKEN
    

    Använd följande värden:

    • Om du använde ett annat namn för din hanterade identitet ersätter du alla instanser av my-ua-managed-id i kommandot med namnet på din hanterade identitet. Det finns fem instanser i frågesträngen.

    • För värdet --admin-user använder du e-postadressen för ditt Azure-konto.

    • För värdet --admin-password använder du åtkomsttoken från föregående utdata, utan citattecken.

    • Kontrollera att databasnamnet är restaurants_reviews.

    Det här Azure CLI-kommandot ansluter till restaurants_reviews-databasen på servern och utfärdar följande SQL-kommandon:

    GRANT CONNECT ON DATABASE restaurants_reviews TO "my-ua-managed-id";
    GRANT USAGE ON SCHEMA public TO "my-ua-managed-id";
    GRANT CREATE ON SCHEMA public TO "my-ua-managed-id";
    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "my-ua-managed-id";
    ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO "my-ua-managed-id";
    

Distribuera webbappen till Container Apps

Container-appar distribueras på Azure Container Apps-miljöer , som utgör en säker gräns. I följande steg skapar du miljön och en container i miljön. Sedan konfigurerar du containern så att webbplatsen visas externt.

De här stegen kräver Azure Container Apps-tillägget containerapp.

  1. Skapa en Container Apps-miljö med hjälp av kommandot az containerapp env create:

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

    <plats> är en av Azure-platsens Name värden från utdata från kommandot az account list-locations -o table.

  2. Hämta inloggningsuppgifterna för Azure Container Registry-instansen med hjälp av kommandot az acr credential show:

    az acr credential show -n <registry-name>
    

    Du använder användarnamnet och ett av de lösenord som returneras från kommandots utdata när du skapar containerappen i steg 5.

  3. Använd kommandot az identity show för att hämta klient-ID och resurs-ID för den användartilldelade hanterade identiteten:

    az identity show --name my-ua-managed-id --resource-group pythoncontainer-rg --query "[clientId, id]" --output tsv
    

    Du använder värdet för klient-ID (GUID) och resurs-ID från kommandots utdata när du skapar containerappen i steg 5. Resurs-ID:t har följande formulär: /subscriptions/<subscription-id>/resourcegroups/pythoncontainer-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-ua-managed-id.

  4. Kör följande kommando för att generera ett hemligt nyckelvärde:

    python -c 'import secrets; print(secrets.token_hex())'
    

    Du använder värdet för hemlig nyckel för att ange en miljövariabel när du skapar containerappen i steg 5.

    Kommentar

    Kommandot som det här steget visar är för ett Bash-gränssnitt. Beroende på din miljö kan du behöva anropa Python med hjälp av python3. I Windows måste du omsluta kommandot i parametern -c med dubbla citattecken i stället för enkla citattecken. Du kan också behöva anropa Python med hjälp av py eller py -3, beroende på din miljö.

  5. Skapa en containerapp i miljön med hjälp av 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 <5000 for Flask or 8000 for Django> \
    --registry-server <registry-name>.azurecr.io \
    --registry-username <registry-username> \
    --registry-password <registry-password> \
    --user-assigned <managed-identity-resource-id> \
    --query properties.configuration.ingress.fqdn \
    --env-vars DBHOST="<postgres-server-name>" \
    DBNAME="restaurants_reviews" \
    DBUSER="my-ua-managed-id" \
    RUNNING_IN_PRODUCTION="1" \
    AZURE_CLIENT_ID="<managed-identity-client-id>" \
    AZURE_SECRET_KEY="<your-secret-key>"
    

    Se till att ersätta alla värden inom vinkelparenteser med värden som du använder i den här självstudien. Tänk på att namnet på din containerapp måste vara unikt i Hela Azure.

    Värdet för parametern --env-vars är en sträng som består av blankstegsavgränsade värden i key="value" format med följande värden:

    • DBHOST="\<postgres-server-name>"
    • DBNAME="restaurants_reviews"
    • DBUSER="my-ua-managed-id"
    • RUNNING_IN_PRODUCTION="1"
    • AZURE_CLIENT_ID="\<managed-identity-client-id>"
    • AZURE_SECRET_KEY="\<your-secret-key>"

    Värdet för DBUSER är namnet på din användartilldelade hanterade identitet.

    Värdet för AZURE_CLIENT_ID är klient-ID för din användartilldelade hanterade identitet. Du fick det här värdet i ett tidigare steg.

    Värdet för AZURE_SECRET_KEY är det hemliga nyckelvärde som du genererade i ett tidigare steg.

  6. För endast Django, migrera och skapa ett databasschema. (I Flask-exempelappen görs den automatiskt och du kan hoppa över det här steget.)

    För att ansluta, använd kommandot az containerapp exec:

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

    I kommandotolken för gränssnittet anger du sedan python manage.py migrate.

    Du behöver inte migrera för revisioner av containern.

  7. Testa webbplatsen.

    Det az containerapp create kommando som du angav tidigare matar ut en program-URL som du kan använda för att bläddra till appen. URL:en slutar i 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 efter att en restaurang har lagts till och två recensioner har lagts till.

Skärmbild av 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-portalen:

  • Gå till sidan Översikt i containerappen och leta efter applikations-URL.

I VS Code:

  1. Gå till Azure-vyn (Ctrl+Skift+A) och expandera prenumerationen som du arbetar i.
  2. Expandera noden Container Apps, expandera den hanterade miljön, högerklicka python-container-appoch välj sedan Bläddra. VS Code öppnar webbläsaren med programmets URL.

I Azure CLI:n:

  • Använd kommandot az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn.

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 fönstret VS Code Output och uppdatera 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 Build Image i Azure uppgift igen kontrollerar du om registret från en tidigare körning finns. I så fall använder du den.

I Azure-portalen visas ett åtkomstfel när en containerapp skapas

Ett åtkomstfel som innehåller "Det går inte att komma åt ACR "<namn>.azurecr.io" inträffar när administratörsautentiseringsuppgifter för en Azure Container Registry-instans inaktiveras.

Om du vill kontrollera administratörsstatusen i portalen går du till din Azure Container Registry-instans, väljer åtkomstnycklar resurs och kontrollerar att administratörsanvändare är aktiverad.

Containeravbildningen visas inte i Azure Container Registry-instansen

  • Kontrollera utdata från Azure CLI-kommandot eller VS Code-utdata och leta efter meddelanden för att bekräfta att det har lyckats.
  • 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 az logini Azure CLI.

Webbplatsen returnerar "Felaktig begäran (400)"

Om du får felet "Felaktig begäran (400)" kontrollerar du 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 (till exempel 1).

Webbplatsen returnerar "Hittades inte (404)"

  • Kontrollera värdet för applikations-URL 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-portalen går du till exempel till ingress- resursen för containern. Kontrollera att HTTP-ingress är aktiverad och att alternativet acceptera trafik från alla håll har valts.

Webbplatsen startar inte, du får "stream timeout" eller så returneras ingenting

  • Kontrollera loggarna:
    • I Azure-portalen går du till containerappens revisionshanteringsresurs och kontrollerar Etableringsstatus för containern:
      • Om statusen är Etablering, vänta tills etableringen har slutförts.
      • Om statusen är Misslyckadesväljer du revisionen och visar konsolloggarna. Välj ordningen på kolumnerna för att visa Tid genererad, Stream_soch Log_s. Sortera loggarna efter de senaste och leta efter Python-stderr och stdout meddelanden i kolumnen Stream_s. Python-print genererar stdout meddelanden.
    • I 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