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.
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:
Logga in på Azure och autentisera om det behövs:
az login
Kontrollera att du kör den senaste versionen av Azure CLI:
az upgrade
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:
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.
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
Ä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.
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 kommandotaz account list-locations -o table
.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.
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.
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.
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.
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 teckenA
Z
,0
till9
och 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 kommandotaz account list-locations -o table
.<admin-username>: Användarnamnet för administratörskontot. Det kan inte vara
azure_superuser
,admin
,administrator
,root
,guest
ellerpublic
. Använddemoadmin
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 exempelStandard_B1ms
. Mer information finns i Priser för Azure Database for PostgreSQL. Om du vill visa tillgängliga nivåer använder duaz postgres flexible-server list-skus --location <location>
.--public-access
: Använd0.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.
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
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.
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>
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 kommandotpgaadauth_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.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.
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 kommandotaz account list-locations -o table
.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.
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
.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 avpy
ellerpy -3
, beroende på din miljö.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.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.
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 iazurecontainerapps.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.
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:
- Gå till Azure-vyn (Ctrl+Skift+A) och expandera prenumerationen som du arbetar i.
- 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 login
i 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
ochstdout
meddelanden i kolumnen Stream_s. Python-print
genererarstdout
meddelanden.
- I Azure CLI använder du kommandot az containerapp logs show.
- I Azure-portalen går du till containerappens revisionshanteringsresurs och kontrollerar Etableringsstatus för containern:
- 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
.