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.
Snímek obrazovky se službami v kurzu – Nasazení aplikace Pythonu v Azure Container Apps
Požadavky
Pokud nemáte předplatné Azure, vytvořte si bezplatný účet předtím, než začnete.
Příkazy Azure CLI je možné spouštět v Azure Cloud Shellu nebo na pracovní stanici s nainstalovaným Azure CLI .
Pokud používáte místně, přihlaste se a nainstalujte potřebné moduly pro tento kurz podle těchto kroků.
Přihlaste se k Azure a v případě potřeby se ověřte:
az login
Ujistěte se, že používáte nejnovější verzi Azure CLI:
az upgrade
Pomocí příkazu az extension add nainstalujte nebo upgradujte rozšíření Azure CLI containerapp a rdbms-connect.
az extension add --name containerapp --upgrade az extension add --name rdbms-connect --upgrade
Poznámka:
Pokud chcete zobrazit seznam rozšíření nainstalovaných ve vašem systému, můžete použít příkaz az extension list. Například
az extension list --query [].name --output tsv
Získání ukázkové aplikace
Vytvoření forku a naklonování ukázkového kódu do vývojového prostředí
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.
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
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.
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
.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ř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č.Pokud se přihlášení nezdaří, ujistěte se, že démon Dockeru běží ve vašem systému.
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.
Pomocí příkazu az acr repository list ověřte, že se image kontejneru vytvořila.
az acr repository list --name <registry-name>
Poznámka:
Kroky v této části vytvoří registr kontejneru na úrovni služby Basic. Tato úroveň je optimalizovaná pro náklady s sadou funkcí a propustností určenou pro scénáře vývojářů a je vhodná pro požadavky tohoto kurzu. V produkčních scénářích byste pravděpodobně použili úroveň služby Standard nebo Premium. Tyto úrovně poskytují vylepšené úrovně úložiště a propustnosti. Chcete-li se dozvědět více, viz úrovně služby Azure Container Registry. Pro informace o cenách se podívejte na ceník služby Azure Container Registry.
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.
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 demoadmin \ --admin-password <admin-password> \ --active-directory-auth Enabled \ --tier burstable \ --sku-name standard_b1ms \ --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žijte 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: Heslo uživatele 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.
--active-directory-auth: Určuje, jestli je na serveru PostreSQL povolené ověřování Microsoft Entra ID. Nastavit na
Enabled
.--sku-name: Název cenové úrovně a konfigurace výpočetních prostředků, například Standard_B1ms. 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žijte "0.0.0.0.0", který umožňuje veřejný přístup k serveru z libovolné služby Azure, například Container Apps.
Poznámka:
Pokud plánujete pracovat se serverem PostgreSQL z místní pracovní stanice pomocí nástrojů, budete muset přidat pravidlo brány firewall pro IP adresu pracovní stanice pomocí příkazu az postgres flexible-server firewall-rule create.
Pomocí příkazu az ad signed-in-user show zjistěte ID objektu svého uživatelského účtu pro použití v následujícím příkazu.
az ad signed-in-user show --query id --output tsv
Pomocí příkazu az postgres flexible-server ad-admin create přidejte uživatelský účet jako správce Microsoft Entra na serveru PostgreSQL.
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>
Jako ID objektu účtu použijte hodnotu, kterou jste získali v předchozím kroku.
Poznámka:
Kroky v této části vytvoří server PostgreSQL s jedním virtuálním jádrem a omezenou pamětí v cenové úrovni Burstable. Úroveň Burstable je možnost nižších nákladů pro úlohy, které nepotřebují nepřetržitě plný procesor a jsou vhodné pro požadavky tohoto kurzu. U produkčních úloh můžete upgradovat na cenovou úroveň Pro obecné účely nebo Optimalizováno pro paměť. Tyto úrovně poskytují vyšší výkon, ale zvyšují náklady. Další informace naleznete v části Možnosti výpočtů v Azure Database for PostgreSQL - flexibilní server. Informace o cenách najdete v tématu ceny služby Azure Database for PostgreSQL.
Vytvoření databáze na serveru
V tuto chvíli máte server PostgreSQL. V této části vytvoříte na serveru databázi.
Pomocí příkazu az postgres flexible-server db create vytvořte databázi s názvem restaurants_reviews.
az postgres flexible-server db create \
--resource-group pythoncontainer-rg \
--server-name <postgres-server-name> \
--database-name restaurants_reviews
Kde:
- 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 serveru PostgreSQL.
K připojení k databázi můžete použít také příkaz az postgres flexible-server connect a pak pracovat s příkazy psql . Při práci s psql je často jednodušší používat Azure Cloud Shell , protože všechny závislosti jsou součástí prostředí.
Můžete se také připojit k flexibilnímu serveru Azure PostgreSQL a vytvořit databázi pomocí psql nebo integrovaného vývojového prostředí, které podporuje PostgreSQL, jako je Azure Data Studio. Postup použití psql najdete v tématu Konfigurace spravované identity v databázi postgresql.
Vytvoření spravované identity přiřazené uživatelem
Vytvořte spravovanou identitu přiřazenou uživatelem. Tato spravovaná identita se použije jako identita pro aplikaci kontejneru při spuštění v Azure.
Poznámka:
Pokud chcete vytvořit spravovanou identitu přiřazenou uživatelem, potřebuje váš účet přispěvatele spravované identity přiřazení role.
Pomocí příkazu az identity create vytvořte spravovanou identitu přiřazenou uživatelem.
az identity create --name my-ua-managed-id --resource-group pythoncontainer-rg
Konfigurace spravované identity v databázi PostgreSQL
Nakonfigurujte spravovanou identitu jako roli na serveru PostgreSQL a udělte jí potřebná oprávnění pro restaurants_reviews databázi. Bez ohledu na to, jestli používáte Azure CLI nebo psql, musíte se připojit k serveru Azure PostgreSQL s uživatelem nakonfigurovaným jako správce Microsoft Entra ve vaší instanci serveru. Spravované identity a další role správce Microsoftu na vašem serveru můžou konfigurovat jenom účty Microsoft Entra nakonfigurované jako správce PostreSQL.
Získejte přístupový token pro váš účet Azure pomocí příkazu az account get-access-token. Přístupový token použijete v následujících krocích.
az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken
Vrácený token je dlouhý. Nastavte jeho hodnotu v proměnné prostředí tak, aby se používaly v příkazech v následujícím kroku:
MY_ACCESS_TOKEN=<your-access-token>
Přidejte spravovanou identitu přiřazenou uživatelem jako databázovou roli na vašem serveru PostgreSQL pomocí příkazu 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
Pokud jste pro spravovanou identitu použili jiný název, nahraďte
my-ua-managed-id
v příkazupgaadauth_create_principal
názvem vaší spravované identity.Jako hodnotu
--admin-user
použijte e-mailovou adresu účtu Azure.Pro hodnotu
--admin-password
použijte výstup přístupového tokenu předchozího příkazu bez uvozovek.Ujistěte se, že je název databáze
postgres
.
Poznámka:
Pokud na místní pracovní stanici spouštíte příkaz az postgres flexible-server execute, ujistěte se, že jste přidali pravidlo brány firewall pro IP adresu vaší pracovní stanice. Pravidlo můžete přidat pomocí příkazu az postgres flexible-server firewall-rule create. Stejný požadavek existuje také pro příkaz v dalším kroku.
Udělte spravované identitě přiřazené uživatelem potřebná oprávnění k databázi restaurants_reviews pomocí následujícího příkazu 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
Pokud jste pro spravovanou identitu použili jiný název, nahraďte všechny instance
my-ua-managed-id
v příkazu názvem vaší spravované identity. V řetězci dotazu je pět instancí.Jako hodnotu
--admin-user
použijte e-mailovou adresu účtu Azure.Pro hodnotu
--admin-password
použijte výstup přístupového tokenu z dřívějška, bez uvozovek.Ujistěte se, že je název databáze
restaurants_reviews
.
Výše uvedený příkaz Azure CLI se připojí k databázi restaurants_reviews na serveru a vydá následující příkazy SQL:
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";
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ě.
Tyto kroky vyžadují rozšíření Azure Container Apps containerapp.
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
.Získejte přihlašovací údaje pro službu Azure Container Registry pomocí příkazu az acr credential show.
az acr credential show -n <registry-name>
Uživatelské jméno a jedno z hesel vrácených z výstupu příkazu použijete při vytváření aplikace kontejneru v kroku 5.
Pomocí příkazu az identity show získejte ID klienta a ID prostředku spravované identity přiřazené uživatelem.
az identity show --name my-ua-managed-id --resource-group pythoncontainer-rg --query "[clientId, id]" --output tsv
Při vytváření aplikace kontejneru v kroku 5 použijete hodnotu ID klienta (GUID) a výstup ID prostředku z příkazu. ID prostředku má následující formát:
/subscriptions/<subscription-id>/resourcegroups/pythoncontainer-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-ua-managed-id
Spuštěním následujícího příkazu vygenerujte hodnotu tajného klíče.
python -c 'import secrets; print(secrets.token_hex())'
Hodnotu tajného klíče použijete k nastavení proměnné prostředí při vytváření aplikace kontejneru v kroku 5.
Poznámka:
Zobrazený příkaz je pro prostředí Bash. V závislosti na vašem prostředí možná budete muset vyvolat Python pomocí
python3
. Ve Windows musíte příkaz uzavřít do-c
parametru v dvojitých uvozovkách, nikoli v jednoduchých uvozovkách. V závislosti na vašem prostředí možná budete muset vyvolat python také pomocípy
nebopy -3
.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 <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>"
Nezapomeňte nahradit všechny hodnoty v hranatých závorkách hodnotami, které používáte v tomto kurzu. Mějte na paměti, že název vaší aplikace kontejneru musí být jedinečný v rámci Azure.
Hodnota parametru
--env-vars
je řetězec složený z hodnot oddělených mezerami ve formátu key="value" s následujícími hodnotami:- 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="<>vašeho tajného klíče "
Hodnota
DBUSER
je název uživatelem přiřazené spravované identity.Hodnota
AZURE_CLIENT_ID
je ID klienta uživatelsky přiřazené spravované identity. Tuto hodnotu jste získali v předchozím kroku.Hodnota
AZURE_SECRET_KEY
je hodnota tajného klíče, kterou jste vygenerovali v předchozím kroku.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řipojte se 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.
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í.
Snímek obrazovky znázorňující příklad ukázkového webu vytvořeného v tomto kurzu
Ř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 Visual Studio Code přejděte do zobrazení Azure (Ctrl+Shift+A) a rozbalte předplatné, ve kterém právě pracujete. Rozbalte uzel Container Apps, pak rozbalte spravované prostředí a klikněte pravým tlačítkem na python-container-app a vyberte Procházet. Otevře prohlížeč s adresou aplikace.
- 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. Chcete-li obnovit, 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 uživatel s oprávněním správce povolený.
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 login
pří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_PRODUCTION
prostř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 .
- Na webu Azure Portal přejděte do prostředku správy revizí aplikace kontejneru a zkontrolujte stav zřizování kontejneru.
- 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
.
- Zkontrolujte protokoly.