Een Python-web-app bouwen en implementeren met Azure Container Apps en PostgreSQL
Dit artikel maakt deel uit van een zelfstudie over het in een container zetten en implementeren van een Python-web-app in Azure Container Apps. Met Container Apps kunt u container-apps implementeren zonder dat u complexe infrastructuur hoeft te beheren.
In dit deel van de zelfstudie leert u hoe u een Python-voorbeeldweb-app (Django of Flask) in een container kunt zetten en implementeren. U bouwt met name de containerinstallatiekopieën in de cloud en implementeert deze in Azure Container Apps. U definieert omgevingsvariabelen waarmee de container-app verbinding kan maken met een Exemplaar van Azure Database for PostgreSQL - Flexible Server , waarin de voorbeeld-app gegevens opslaat.
In dit servicediagram worden de onderdelen beschreven in dit artikel: een containerinstallatiekopieën bouwen en implementeren.
De voorbeeld-app downloaden
Fork en kloon de voorbeeldcode naar uw ontwikkelomgeving.
Stap 1. Ga naar de GitHub-opslagplaats van de voorbeeld-app (Django of Flask) en selecteer Fork.
Volg de stappen om de map te forkeren naar uw GitHub-account. U kunt de codeopslagplaats ook rechtstreeks naar uw lokale computer downloaden zonder te forken of een GitHub-account, maar u kunt CI/CD die verderop in de zelfstudie wordt besproken, niet instellen.
Stap 2. Gebruik de git-kloonopdracht om de geforkte opslagplaats te klonen in de map 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
Stap 3. Map wijzigen.
cd python-container
Een containerinstallatiekopieën bouwen vanuit web-app-code
Nadat u deze stappen hebt uitgevoerd, hebt u een Azure Container Registry met een Docker-containerinstallatiekopie die is gebouwd op basis van de voorbeeldcode.
Azure CLI-opdrachten kunnen worden uitgevoerd in Azure Cloud Shell of op een werkstation waarop de Azure CLI is geïnstalleerd.
Stap 1. Een resourcegroep maken met de opdracht az group create.
az group create \
--name pythoncontainer-rg \
--location <location>
<locatie> is een van de Azure-locatienaamwaarden uit de uitvoer van de opdrachtaz account list-locations -o table
.
Stap 2. Maak een containerregister met de opdracht az acr create .
az acr create \
--resource-group pythoncontainer-rg \
--name <registry-name> \
--sku Basic \
--admin-enabled
<registernaam> moet uniek zijn binnen Azure en mag 5-50 alfanumerieke tekens bevatten.
U kunt de referenties bekijken die zijn gemaakt voor de beheerder met:
az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg
Stap 3. Meld u aan bij het register met behulp van de opdracht az acr login .
az acr login --name <registry-name>
Met de opdracht wordt 'azurecr.io' toegevoegd aan de naam om de volledig gekwalificeerde registernaam te maken. Als dit lukt, ziet u het bericht 'Aanmelden voltooid'. Als u het register opent vanuit een ander abonnement dan het abonnement waarin het register is gemaakt, gebruikt u de --suffix
schakeloptie.
Stap 4. Bouw de installatiekopieën met de opdracht az acr build .
az acr build \
--registry <registry-name> \
--resource-group pythoncontainer-rg \
--image pythoncontainer:latest .
Opmerking:
De punt (".") aan het einde van de opdracht geeft de locatie aan van de broncode die moet worden gebouwd. Als u deze opdracht niet uitvoert in de hoofdmap van de voorbeeld-app, geeft u het pad naar de code op.
Als u de opdracht uitvoert in Azure Cloud Shell, gebruikt
git clone
u eerst om de opslagplaats eerst naar de Cloud Shell-omgeving te halen en de map te wijzigen in de hoofdmap van het project, zodat punt ('.') correct wordt geïnterpreteerd.Als u de
-t
optie (hetzelfde als--image
) weglaat, wordt met de opdracht een lokale contextbuild in de wachtrij geplaatst zonder deze naar het register te pushen. Bouwen zonder pushen kan handig zijn om te controleren of de installatiekopieën worden gebouwd.
Stap 5. Controleer of de containerinstallatiekopieën zijn gemaakt met de opdracht az acr repository list .
az acr repository list --name <registry-name>
Een PostgreSQL Flexible Server-exemplaar maken
In de voorbeeld-app (Django of Flask) worden restaurantbeoordelingsgegevens opgeslagen in een PostgreSQL-database. In deze stappen maakt u de server die de database bevat.
Azure CLI-opdrachten kunnen worden uitgevoerd in Azure Cloud Shell of op een werkstation waarop de Azure CLI is geïnstalleerd.
Stap 1. Gebruik de opdracht az postgres flexible-server create om de PostgreSQL-server in Azure te maken. Het is niet ongebruikelijk dat deze opdracht enkele minuten wordt uitgevoerd.
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' → de naam van de resourcegroep die in deze zelfstudie wordt gebruikt. Als u een andere naam hebt gebruikt, wijzigt u deze waarde.
<postgres-server-name> → de naam van de PostgreSQL-databaseserver. Deze naam moet uniek zijn in azure. Het servereindpunt is 'https://< postgres-server-name.postgres.database.azure.com>'. Toegestane tekens zijn 'A'-'Z', '0'-'9' en '-'.
<locatie> → Gebruik dezelfde locatie die wordt gebruikt voor de web-app. <locatie> is een van de Azure-locatienaamwaarden uit de uitvoer van de opdracht
az account list-locations -o table
.<admin-username> → gebruikersnaam voor het beheerdersaccount. Het kan niet 'azure_superuser', 'admin', 'administrator', 'root', 'guest' of 'public' zijn. Gebruik demoadmin voor deze zelfstudie.
<beheerderswachtwoordwachtwoord> van de beheerdergebruiker. Het moet 8 tot 128 tekens bevatten uit drie van de volgende categorieën: Engelse hoofdletters, Nederlandse kleine letters, cijfers en niet-alfanumerieke tekens.
Belangrijk
Bij het maken van gebruikersnamen of wachtwoorden wordt het teken $niet gebruikt. Later maakt u omgevingsvariabelen met deze waarden waarbij het teken $een speciale betekenis heeft binnen de Linux-container die wordt gebruikt om Python-apps uit te voeren.
<sku-name>
→ De naam van de prijscategorie en rekenconfiguratie, bijvoorbeeld 'Standard_D2s_v3'. Zie Prijzen voor Azure Database for PostgreSQL voor meer informatie. Als u beschikbare SKU's wilt weergeven, gebruikt uaz postgres flexible-server list-skus --location <location>
.<public-access>
→ Gebruik 0.0.0.0, waarmee openbare toegang tot de server mogelijk is vanuit elke Azure-service, zoals Container Apps.
Notitie
Als u van plan bent om de PostgreSQL-server vanaf uw lokale werkstation te werken met andere hulpprogramma's dan Azure CLI, moet u een firewallregel toevoegen met de opdracht az postgres flexible-server firewall-rule create .
Een database maken op de server
Op dit moment hebt u een PostgreSQL-server. In deze sectie maakt u een database op de server.
U kunt de interactieve PostgreSQL-terminal psql gebruiken in uw lokale omgeving of in de Azure Cloud Shell, die ook toegankelijk is in Azure Portal. Wanneer u met psql werkt, is het vaak eenvoudiger om de Cloud Shell te gebruiken, omdat alle afhankelijkheden voor u zijn opgenomen in de shell.
Stap 1. Maak verbinding met de database met psql.
psql --host=<postgres-server-name>.postgres.database.azure.com \
--port=5432 \
--username=demoadmin@<postgres-server-name> \
--dbname=postgres
Hierbij is postgres-servernaam de naam van de PostgreSQL-server>.< Met de opdracht wordt u om het beheerderswachtwoord gevraagd.
Als u problemen ondervindt bij het maken van verbinding, start u de database opnieuw en probeert u het opnieuw. Als u verbinding maakt vanuit uw lokale omgeving, moet uw IP-adres worden toegevoegd aan de lijst met firewallregels voor de databaseservice.
Stap 2. Maak de database.
Typ bij de postgres=>
prompt:
CREATE DATABASE restaurants_reviews;
De puntkomma (";") aan het einde van de opdracht is nodig. Gebruik de opdracht \c restaurants_reviews
om te controleren of de database is gemaakt. Typ \?
om hulp weer te geven of \q
af te sluiten.
U kunt ook verbinding maken met Azure PostgreSQL Flexible Server en een database maken met behulp van Azure Data Studio of een andere IDE die PostgreSQL ondersteunt.
De web-app implementeren in Container Apps
Container-apps worden geïmplementeerd in Container Apps-omgevingen, die fungeren als een veilige grens. In de volgende stappen maakt u de omgeving, een container in de omgeving en configureert u de container zodat de website extern zichtbaar is.
Stap 1. Meld u aan bij Azure en verifieer, indien nodig.
az login
Stap 2. Installeer of upgrade de extensie voor Azure Container Apps met az extension add command.
az extension add --name containerapp --upgrade
Stap 3. Maak een Container Apps-omgeving met de opdracht az containerapp env create .
az containerapp env create \
--name python-container-env \
--resource-group pythoncontainer-rg \
--location <location>
<locatie> is een van de Azure-locatienaamwaarden uit de uitvoer van de opdrachtaz account list-locations -o table
.
Stap 4. Haal de aanmeldingsreferenties voor Azure Container Registry op.
az acr credential show -n <registry-name>
Gebruik de gebruikersnaam en een van de wachtwoorden die worden geretourneerd uit de uitvoer van de opdracht.
Stap 5. Maak een container-app in de omgeving met de opdracht 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 is een tekenreeks> die bestaat uit door spaties gescheiden waarden in de notatie key="value" met de volgende waarden.
- 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>
Waarde genereren AZURE_SECRET_KEY
met behulp van uitvoer van python -c 'import secrets; print(secrets.token_hex())'
.
Hier is een voorbeeld: --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
.
Stap 7. Alleen voor Django migreert en maakt u een databaseschema. (In de Flask-voorbeeld-app wordt deze automatisch uitgevoerd en kunt u deze stap overslaan.)
Maak verbinding met de opdracht az containerapp exec :
az containerapp exec \
--name python-container-app \
--resource-group pythoncontainer-rg
Typ vervolgens bij de opdrachtprompt van python manage.py migrate
de shell.
U hoeft niet te migreren voor revisies van de container.
Stap 8. Test de website.
Met de az containerapp create
opdracht die u eerder hebt ingevoerd, wordt een toepassings-URL uitgevoerd die u kunt gebruiken om naar de app te bladeren. De URL eindigt op 'azurecontainerapps.io'. Navigeer naar de URL in een browser. U kunt ook de opdracht az containerapp browse gebruiken.
Hier volgt een voorbeeld van de voorbeeldwebsite na het toevoegen van een restaurant en twee beoordelingen.
Problemen met implementatie oplossen
U bent de toepassings-URL vergeten om toegang te krijgen tot de website.
- Ga in Azure Portal naar de pagina Overzicht van de container-app en zoek naar de toepassings-URL.
- Ga in VS Code naar de Azure-weergave (Ctrl+Shift+A) en vouw het abonnement uit waarin u werkt. Vouw het Container Apps-knooppunt uit, vouw vervolgens de beheerde omgeving uit en klik met de rechtermuisknop op python-container-app en selecteer Bladeren. De browser wordt geopend met de toepassings-URL.
- In Azure CLI gebruikt u de opdracht
az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn
.
In VS Code retourneert de build-installatiekopieën in de Azure-taak een fout.
- Als u het bericht 'Fout: kan context niet downloaden. Controleer of de URL onjuist is.' in het venster UITVOER van VS Code en vernieuw het register in de Docker-extensie. Als u wilt vernieuwen, selecteert u de Docker-extensie, gaat u naar de sectie Registers, zoekt u het register en selecteert u deze.
- Als u de build-installatiekopieën opnieuw uitvoert in De Azure-taak , controleert u of uw register van een vorige uitvoering bestaat en als dat het het volgende is, gebruikt u deze.
In Azure Portal tijdens het maken van een container-app ziet u een toegangsfout met 'Kan geen toegang krijgen tot ACR'name.azurecr.io<>'.
- Deze fout treedt op wanneer beheerdersreferenties op de ACR zijn uitgeschakeld. Als u de beheerdersstatus in de portal wilt controleren, gaat u naar uw Azure Container Registry, selecteert u de resource Toegangssleutels en zorgt u ervoor dat de gebruiker Beheerder is ingeschakeld.
Uw containerinstallatiekopieën worden niet weergegeven in Azure Container Registry.
- Controleer de uitvoer van de Azure CLI-opdracht of VS Code-uitvoer en zoek naar berichten om te bevestigen dat deze zijn geslaagd.
- Controleer of de naam van het register juist is opgegeven in de build-opdracht met de Azure CLI of in de opdrachtprompts van VS Code.
- Zorg ervoor dat uw referenties niet zijn verlopen. Zoek in VS Code bijvoorbeeld het doelregister in de Docker-extensie en vernieuw het. Voer in Azure CLI de opdracht uit
az login
.
De website retourneert 'Ongeldige aanvraag (400)'.
- Controleer de PostgreSQL-omgevingsvariabelen die worden doorgegeven aan de container. De 400-fout geeft vaak aan dat de Python-code geen verbinding kan maken met het PostgreSQL-exemplaar.
- De voorbeeldcode die in deze zelfstudie wordt gebruikt, controleert op het bestaan van de containeromgevingsvariabele
RUNNING_IN_PRODUCTION
, die kan worden ingesteld op elke waarde, zoals '1'.
De website retourneert 'Niet gevonden (404)'.
- Controleer de toepassings-URL op de overzichtspagina voor de container. Als de toepassings-URL het woord 'intern' bevat, is inkomend verkeer niet juist ingesteld.
- Controleer het inkomend verkeer van de container. Ga bijvoorbeeld in Azure Portal naar de resource Inkomend verkeer van de container en zorg ervoor dat HTTP-inkomend verkeer is ingeschakeld en dat verkeer vanaf elke locatie wordt geaccepteerd.
De website wordt niet gestart, u ziet 'streamtime-out' of er wordt niets geretourneerd.
- Controleer de logboeken.
- Ga in Azure Portal naar de resource Revisiebeheer van de container-app en controleer de inrichtingsstatus van de container.
- Als 'Inrichten' wordt uitgevoerd, wacht u totdat het inrichten is voltooid.
- Als 'Mislukt' is, selecteert u de revisie en bekijkt u de consolelogboeken. Kies de volgorde van de kolommen om 'Tijd gegenereerd', 'Stream_s' en 'Log_s' weer te geven. Sorteer de logboeken op de meest recente eerste en zoek naar Python-stderr- en stdout-berichten in de kolom 'Stream_s'. Python-uitvoer 'afdrukken' bevat stdout-berichten .
- Gebruik met de Azure CLI de opdracht az containerapp logs show .
- Ga in Azure Portal naar de resource Revisiebeheer van de container-app en controleer de inrichtingsstatus van de container.
- Als u het Django-framework gebruikt, controleert u of de restaurants_reviews tabellen in de database aanwezig zijn. Als dat niet het is, gebruikt u een console om toegang te krijgen tot de container en deze uit te voeren
python manage.py migrate
.
- Controleer de logboeken.