Vytvoření a nasazení webové aplikace v Pythonu pomocí Azure Container Apps a PostgreSQL

Tento článek je součástí kurzu o kontejnerizaci a nasazení webové aplikace v Pythonu do Azure Container Apps. Container Apps umožňuje nasazovat kontejnerizované aplikace bez nutnosti spravovat složitou infrastrukturu.

V této části kurzu se dozvíte, jak kontejnerizovat a nasadit ukázkovou webovou aplikaci v Pythonu (Django nebo Flask). Konkrétně sestavíte image kontejneru v cloudu a nasadíte ji do Azure Container Apps. Definujete proměnné prostředí, které aplikaci kontejneru umožňují připojit se k instanci flexibilního serveru Azure Database for PostgreSQL, kde ukázková aplikace ukládá data.

Tento diagram služby zvýrazňuje součásti popsané v tomto článku: sestavení a nasazení image kontejneru.

A screenshot of the services in the Tutorial - Deploy a Python App on Azure Container Apps. Section highlighted is what is covered in this article.

Získání ukázkové aplikace

Vytvoření forku a naklonování ukázkového kódu do vývojového prostředí

Krok 1. Přejděte do úložiště GitHub ukázkové aplikace (Django nebo Flask) a vyberte Fork.

Postupujte podle pokynů k vytvoření forku adresáře do účtu GitHubu. Úložiště kódu si také můžete stáhnout přímo na místní počítač bez forku nebo účtu GitHubu, ale později v tomto kurzu nebudete moct nastavit CI/CD.

Krok 2. Pomocí příkazu git clone naklonujte forkované úložiště do složky 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

Krok 3. Změňte adresář.

cd python-container

Sestavení image kontejneru z kódu webové aplikace

Po provedení těchto kroků budete mít Službu Azure Container Registry, která obsahuje image kontejneru Dockeru sestavenou z ukázkového kódu.

Příkazy Azure CLI je možné spouštět v Azure Cloud Shellu nebo na pracovní stanici s nainstalovaným Azure CLI .

Krok 1. Vytvořte skupinu prostředků pomocí příkazu az group create.

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

<location> is one of the Azure location Name values from the output of the command az account list-locations -o table.

Krok 2. Vytvořte registr kontejneru pomocí příkazu az acr create .

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

<Název> registru musí být v rámci Azure jedinečný a musí obsahovat 5 až 50 alfanumerických znaků.

Přihlašovací údaje vytvořené pro správce můžete zobrazit pomocí:

az acr credential show \
--name <registry-name> \
--resource-group pythoncontainer-rg

Krok 3. Přihlaste se k registru pomocí příkazu az acr login .

az acr login --name <registry-name>

Příkaz přidá do názvu "azurecr.io", aby se vytvořil plně kvalifikovaný název registru. V případě úspěchu se zobrazí zpráva Přihlášení bylo úspěšné. Pokud přistupujete k registru z předplatného, které se liší od předplatného, ve kterém byl registr vytvořen, použijte --suffix přepínač.

Krok 4. Sestavte image pomocí příkazu az acr build .

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

Poznámky:

  • Tečka (".") na konci příkazu označuje umístění zdrojového kódu, které se má sestavit. Pokud tento příkaz nespouštět v kořenovém adresáři ukázkové aplikace, zadejte cestu k kódu.

  • Pokud příkaz spouštíte v Azure Cloud Shellu, použijte git clone k prvnímu načtení úložiště do prostředí Cloud Shell a změňte adresář na kořen projektu tak, aby se tečka (".") správně interpretovala.

  • Pokud možnost (stejná jako--image) vynecháte -t , příkaz zařadí do fronty sestavení místního kontextu bez toho, aby ho nasdílel do registru. Sestavení bez nabízení může být užitečné ke kontrole sestavení image.

Krok 5. Pomocí příkazu az acr repository list ověřte, že se image kontejneru vytvořila.

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

Vytvoření instance flexibilního serveru PostgreSQL

Ukázková aplikace (Django nebo Flask) ukládá data kontroly restaurace v databázi PostgreSQL. V těchto krocích vytvoříte server, který bude obsahovat databázi.

Příkazy Azure CLI je možné spouštět v Azure Cloud Shellu nebo na pracovní stanici s nainstalovaným Azure CLI .

Krok 1. K vytvoření serveru PostgreSQL v Azure použijte příkaz az postgres flexible-server create. Není neobvyklé, že se tento příkaz spustí několik minut.

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" → Název skupiny prostředků použitý v tomto kurzu. Pokud jste použili jiný název, změňte tuto hodnotu.

  • <postgres-server-name> → Název databázového serveru PostgreSQL. Tento název musí být jedinečný ve všech Azure. Koncový bod serveru je "https://< postgres-server-name.postgres.database.azure.com>". Povolené znaky jsou "A"-"Z", "0"-"9" a "-".

  • <umístění> → Použít stejné umístění jako pro webovou aplikaci. <location> is one of the Azure location Name values from the output of the command az account list-locations -o table.

  • <uživatelské jméno správce → Uživatelské jméno> pro účet správce. Nemůže to být "azure_superuser", "admin", "administrator", "root", "guest" nebo "public". Pro účely tohoto kurzu použijte demoadmin.

  • <heslo> správce. Musí obsahovat 8 až 128 znaků ze tří z následujících kategorií: velká písmena anglické abecedy, malá písmena anglické abecedy, číslice a jiné než alfanumerické znaky.

    Důležité

    Při vytváření uživatelských jmen nebo hesel nepoužívejte znak $. Později vytvoříte proměnné prostředí s těmito hodnotami, kde znak "$" má v kontejneru Linuxu speciální význam, který se používá ke spouštění aplikací v Pythonu.

  • <sku-name> → Název cenové úrovně a konfigurace výpočetních prostředků, například Standard_D2s_v3. Další informace najdete v tématu o cenách služby Azure Database for PostgreSQL. Pokud chcete zobrazit seznam dostupných skladových položek, použijte az postgres flexible-server list-skus --location <location>.

  • <public-access> → použít "0.0.0.0.0", který umožňuje veřejný přístup k serveru z libovolné služby Azure, jako je Container Apps.

Poznámka:

Pokud plánujete pracovat na serveru PostgreSQL z místní pracovní stanice s jinými nástroji než Azure CLI, budete muset přidat pravidlo brány firewall pomocí příkazu az postgres flexible-server firewall-rule create .

Vytvoření databáze na serveru

V tuto chvíli máte server PostgreSQL. V této části vytvoříte na serveru databázi.

Interaktivní terminál PostgreSQL můžete použít ve svém místním prostředí nebo v Azure Cloud Shellu, který je přístupný také na webu Azure Portal. Při práci s psql je často jednodušší používat Cloud Shell , protože všechny závislosti jsou součástí prostředí.

Krok 1. Připojení do databáze pomocí psql.

psql --host=<postgres-server-name>.postgres.database.azure.com \
     --port=5432 \
     --username=demoadmin@<postgres-server-name> \
     --dbname=postgres

Kde <postgres-server-name> je název serveru PostgreSQL. Příkaz vás vyzve k zadání hesla správce.

Pokud máte potíže s připojením, restartujte databázi a zkuste to znovu. Pokud se připojujete z místního prostředí, musí se VAŠE IP adresa přidat do seznamu pravidel brány firewall pro databázovou službu.

Krok 2. Vytvořte databázi.

Do příkazového postgres=> řádku zadejte:

CREATE DATABASE restaurants_reviews;

Středník (";") na konci příkazu je nezbytný. K ověření úspěšného vytvoření databáze použijte příkaz \c restaurants_reviews. Zadáním \? zobrazíte nápovědu nebo \q ukončíte.

Můžete se také připojit k flexibilnímu serveru Azure PostgreSQL a vytvořit databázi pomocí nástroje Azure Data Studio nebo libovolného jiného integrovaného vývojového prostředí, které podporuje PostgreSQL.

Nasazení webové aplikace do Container Apps

Kontejnerové aplikace se nasazují do prostředí Container Apps, která fungují jako zabezpečená hranice. V následujících krocích vytvoříte prostředí, kontejner uvnitř prostředí a nakonfigurujete kontejner tak, aby byl web viditelný externě.

Krok 1. Přihlaste se k Azure a v případě potřeby se ověřte.

az login

Krok 2. Nainstalujte nebo upgradujte rozšíření pro Azure Container Apps pomocí příkazu az extension add .

az extension add --name containerapp --upgrade

Krok 3. Vytvořte prostředí Container Apps pomocí příkazu az containerapp env create .

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

<location> is one of the Azure location Name values from the output of the command az account list-locations -o table.

Krok 4. Získejte přihlašovací údaje pro službu Azure Container Registry.

az acr credential show -n <registry-name>

Použijte uživatelské jméno a jedno z hesel vrácených z výstupu příkazu.

Krok 5. Pomocí příkazu az containerapp create vytvořte v prostředí aplikaci kontejneru.

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 je řetězec> složený z hodnot oddělených mezerami ve formátu key="value" s následujícími hodnotami.

  • 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>

Generovat AZURE_SECRET_KEY hodnotu pomocí výstupu .python -c 'import secrets; print(secrets.token_hex())'

Následuje příklad: --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.

Krok 7. Pouze pro Django migrujte a vytvořte schéma databáze. (V ukázkové aplikaci Flask se provádí automaticky a můžete tento krok přeskočit.)

Připojení pomocí příkazu az containerapp exec:

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

Potom na příkazovém řádku prostředí zadejte python manage.py migrate.

Pro revize kontejneru nemusíte migrovat.

Krok 8. Otestujte web.

Příkaz az containerapp create , který jste zadali dříve, vypíše adresu URL aplikace, kterou můžete použít k procházení aplikace. Adresa URL končí na "azurecontainerapps.io". V prohlížeči přejděte na adresu URL. Alternativně můžete použít příkaz az containerapp browse .

Tady je příklad ukázkového webu po přidání restaurace a dvou recenzí.

Screenshot showing an example of the sample website built in this tutorial.

Řešení potíží s nasazením

  • Zapomněli jste adresu URL aplikace pro přístup k webu.

    • Na webu Azure Portal přejděte na stránku Přehled aplikace kontejneru a vyhledejte adresu URL aplikace.
    • Ve VS Code přejděte do rozšíření Azure a vyberte oddíl Container Apps . Rozbalte předplatné, rozbalte prostředí kontejneru a až najdete aplikaci kontejneru, klikněte pravým tlačítkem na python-container-app a vyberte Procházet.
    • V Azure CLI použijte příkaz az containerapp show -g pythoncontainer-rg -n python-container-app --query properties.configuration.ingress.fqdn.
  • V nástroji VS Code vrátí image sestavení v úloze Azure chybu.

    • Pokud se zobrazí zpráva Chyba: Nepodařilo se stáhnout kontext. Zkontrolujte, jestli adresa URL není správná. V okně výstupu VS Code aktualizujte registr v rozšíření Docker. Pokud chcete aktualizaci aktualizovat, vyberte rozšíření Dockeru, přejděte do části Registry, vyhledejte registr a vyberte ho.
    • Pokud znovu spustíte úlohu Sestavení image v Azure , zkontrolujte, jestli váš registr z předchozího spuštění existuje, a pokud ano, použijte ji.
  • Na webu Azure Portal během vytváření aplikace kontejneru se zobrazí chyba přístupu, která obsahuje "Nejde získat přístup k ACR name.azurecr.io<>".

    • K této chybě dochází, když jsou přihlašovací údaje správce ve službě ACR zakázané. Pokud chcete zkontrolovat stav správce na portálu, přejděte do služby Azure Container Registry, vyberte prostředek přístupových klíčů a ujistěte se, že je povolený Správa uživatel.
  • Vaše image kontejneru se nezobrazuje ve službě Azure Container Registry.

    • Zkontrolujte výstup příkazu Azure CLI nebo výstupu VS Code a vyhledejte zprávy, které potvrdí úspěch.
    • Zkontrolujte, jestli se název registru správně zadal v příkazu sestavení pomocí Azure CLI nebo v výzev k úlohám VS Code.
    • Ujistěte se, že nevypršela platnost vašich přihlašovacích údajů. Například ve VS Code vyhledejte cílový registr v rozšíření Dockeru a aktualizujte ho. V Azure CLI spusťte az loginpříkaz .
  • Web vrátí chybný požadavek (400).

    • Zkontrolujte proměnné prostředí PostgreSQL předávané do kontejneru. Chyba 400 často značí, že kód Pythonu se nemůže připojit k instanci PostgreSQL.
    • Vzorový kód použitý v tomto kurzu kontroluje existenci proměnné RUNNING_IN_PRODUCTIONprostředí kontejneru, která se dá nastavit na libovolnou hodnotu, například 1.
  • Webová stránka vrátí "Nenalezena (404)".

    • Zkontrolujte adresu URL aplikace na stránce Přehled kontejneru. Pokud adresa URL aplikace obsahuje slovo "interní", není příchozí přenos dat správně nastavený.
    • Zkontrolujte příchozí přenos dat kontejneru. Například na webu Azure Portal přejděte k prostředku příchozího přenosu dat kontejneru a ujistěte se, že je povolený příchozí přenos HTTP a že je vybraný příjem provozu z libovolného místa .
  • Web se nespustí, zobrazí se "vypršení časového limitu streamu" nebo se nic nevrátí.

    • Zkontrolujte protokoly.
      • Na webu Azure Portal přejděte do prostředku správy revizí aplikace kontejneru a zkontrolujte stav zřizování kontejneru.
        • Pokud se jedná o zřizování, počkejte, až se zřizování dokončí.
        • Pokud se nezdařilo, vyberte revizi a zobrazte protokoly konzoly. Zvolte pořadí sloupců, ve kterých se má zobrazit "Čas vygenerovaný", "Stream_s" a "Log_s". Seřaďte protokoly podle nejnovějšího data a ve sloupci "Stream_s" vyhledejte zprávy stderr a stdout Pythonu. Výstupem pythonu print budou zprávy stdout .
      • Pomocí Azure CLI použijte příkaz az containerapp logs show .
    • Pokud používáte architekturu Django, zkontrolujte, jestli v databázi existují restaurants_reviews tabulky. Pokud ne, použijte konzolu pro přístup ke kontejneru a spusťte python manage.py migrate.

Další krok