Sdílet prostřednictvím


Vytvoření a nasazení webové aplikace Flask Python do Azure se spravovanou identitou přiřazenou systémem

V tomto kurzu nasadíte kód Python Flask k vytvoření a nasazení webové aplikace spuštěné ve službě Azure App Service. Webová aplikace používá svoji spravovanou identitu, přiřazenou systémem (pro připojení bez hesel), s řízením přístupu na základě role v Azure k přístupu ke službě Azure Storage a k prostředkům Azure Database for PostgreSQL – Flexible Server. Kód používá třídu DefaultAzureCredential z klientské knihovny Azure Identity pro Python. Třída DefaultAzureCredential automaticky zjistí, že pro službu App Service existuje spravovaná identita, a využívá ji k přístupu k dalším prostředkům Azure.

Pomocí konektoru Service Connector můžete nakonfigurovat připojení bez hesla ke službám Azure nebo je můžete nakonfigurovat ručně. V tomto kurzu se dozvíte, jak používat konektor Service Connector. Další informace o připojeních bez hesla najdete v tématu Připojení bez hesla pro služby Azure. Pro informace o konektoru služby si prosím přečtěte dokumentaci ke konektoru služby.

Tento kurz ukazuje, jak vytvořit a nasadit webovou aplikaci v Pythonu pomocí Azure CLI. Příkazy v tomto kurzu spusťte v jakémkoli prostředí Bash s nainstalovaným Azure CLI, jako je vaše místní prostředí nebo Azure Cloud Shell.

Pro příklady použití identity spravované uživatelem viz Vytvoření a nasazení webové aplikace Django do Azure s identitou spravovanou uživatelem.

Získání ukázkové aplikace

K dispozici je ukázková aplikace Pythonu využívající architekturu Flask, která vám pomůže postupovat podle tohoto kurzu. Stáhněte nebo naklonujte jednu z ukázkových aplikací do místní pracovní stanice.

  1. Naklonujte ukázkový příklad v relaci Azure Cloud Shell.

    git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.git
    
  2. Přejděte do složky aplikace.

    cd msdocs-flask-web-app-managed-identity
    

Prozkoumání ověřovacího kódu

Ukázková webová aplikace se musí ověřit ve dvou různých úložištích dat:

  • Azure Blob Storage Server, do kterého ukládá a načítá fotky odeslané revidujícím.
  • Databáze Azure Database for PostgreSQL pro flexibilní servery, kde se ukládají informace o restauracích a recenzích.

DefaultAzureCredential se používá k ověřování v obou úložištích dat. S aplikací DefaultAzureCredential lze nakonfigurovat spuštění pod identitami různých služebních zásad, v závislosti na prostředí, ve kterém je spuštěna, a to bez nutnosti měnit kód. Například v místním vývojovém prostředí může aplikace běžet pod identitou vývojáře přihlášeného k Azure CLI, zatímco v Azure, jak je uvedeno v tomto kurzu, může běžet pod spravovanou identitou přiřazenou systémem.

V obou případech musí mít objekt zabezpečení, pod kterým aplikace běží, roli pro každý prostředek Azure, který aplikace používá, a tato role musí umožňovat provádění akcí, které aplikace na prostředku vyžaduje. V tomto kurzu použijete konektory služeb k automatickému povolení spravované identity přiřazené systémem ve vaší aplikaci v Azure a k přiřazení příslušných rolí identity na vašem účtu úložiště Azure a serveru Azure Database for PostgreSQL.

Po povolení spravované identity přiřazené systémem a přiřazení vhodných rolí v úložištích dat můžete použít DefaultAzureCredential k ověření s požadovanými prostředky Azure.

Následující kód slouží k vytvoření klienta úložiště Blob pro nahrání fotek v app.py. Instance DefaultAzureCredential je dodávána klientovi za účelem získání přístupových tokenů k provádění operací s úložištěm Azure.

from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient

azure_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
    account_url=account_url,
    credential=azure_credential)

Instance DefaultAzureCredential se také používá k získání přístupového tokenu pro Azure Database for PostgreSQL v ./azureproject/get_conn.py. V tomto případě se token získá přímo voláním get_token na instanci pověření a předáním odpovídající hodnoty scope. Token se pak použije místo hesla v identifikátoru URI připojení PostgreSQL, který je vrácen volajícímu.

azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conn = str(current_app.config.get('DATABASE_URI')).replace('PASSWORDORTOKEN', token.token)

Další informace o ověřování aplikací pomocí služeb Azure najdete v tématu Ověřování aplikací Pythonu ve službách Azure pomocí sady Azure SDK pro Python. Další informace o DefaultAzureCredential, včetně toho, jak přizpůsobit řetěz přihlašovacích údajů, který vyhodnotí pro vaše prostředí, najdete v přehledu DefaultAzureCredential.

Vytvoření serveru Azure PostgreSQL

  1. Nastavte proměnné prostředí potřebné pro kurz.

    LOCATION="eastus"
    RAND_ID=$RANDOM
    RESOURCE_GROUP_NAME="msdocs-mi-web-app"
    APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID"
    DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID"
    ADMIN_USER="demoadmin"
    ADMIN_PW="ChAnG33#ThsPssWD$RAND_ID"
    

    Důležité

    Musí ADMIN_PW 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 nealfanumerické znaky. 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á zvláštní význam v Linuxovém kontejneru používaném ke spouštění aplikací Pythonu.

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

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. Vytvořte server PostgreSQL pomocí příkazu az postgres flexible-server create. (Tento a další příkazy používají znak pokračování řádku pro prostředí Bash ('\'). V případě potřeby změňte znak pokračování řádku pro shell.

    az postgres flexible-server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $DB_SERVER_NAME \
      --location $LOCATION \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --sku-name Standard_D2ds_v4
    

    Název sku-name je název cenové úrovně a konfigurace výpočetního systému. Další informace najdete na ceníku služby Azure Database for PostgreSQL. Pro zobrazení seznamu dostupných skladových položek použijte az postgres flexible-server list-skus --location $LOCATION.

  4. Vytvořte databázi s názvem restaurant pomocí příkazu az postgres flexible-server execute.

    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --database-name postgres \
      --querytext 'create database restaurant;'
    

Vytvoření služby Aplikace Azure a nasazení kódu

  1. Vytvořte službu App Service pomocí příkazu az webapp up.

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --runtime PYTHON:3.9 \
      --sku B1
    

    SKU definuje velikost (CPU, paměť) a náklady plánu služby App Service. Za plán služby B1 (Basic) jsou ve vašem předplatném Azure účtovány malé náklady. Pro úplný seznam plánů služby App Service navštivte stránku cen služby App Service.

  2. Nakonfigurujte službu App Service tak, aby používala start.sh v úložišti pomocí příkazu az webapp config set.

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --startup-file "start.sh"
    

Vytváření konektorů bez hesel pro prostředky Azure

Příkazy konektoru služeb konfiguruje prostředky Azure Storage a Azure Database for PostgreSQL tak, aby používaly spravovanou identitu a řízení přístupu na základě role v Azure. Příkazy vytvoří nastavení aplikace ve službě App Service, která k těmto prostředkům připojí vaši webovou aplikaci. Výstup z příkazů uvádí akce konektoru služby, které se provedly za účelem povolení funkce bez hesla.

  1. Přidejte konektor služby PostgreSQL pomocí příkazu [az webapp connection create postgres-flexible]. Spravovaná identita přiřazená systémem se v tomto případě používá k ověření webové aplikace v cílovém prostředku PostgreSQL.

    az webapp connection create postgres-flexible \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --target-resource-group $RESOURCE_GROUP_NAME \
      --server $DB_SERVER_NAME \
      --database restaurant \
      --client-type python \
      --system-identity
    
  2. Přidejte konektor pro službu úložiště pomocí příkazu az webapp connection create storage-blob.

    Tento příkaz také přidá účet úložiště a přidá webovou aplikaci s rolí „Přispěvatel dat objektu blob úložiště“ do účtu úložiště.

    STORAGE_ACCOUNT_URL=$(az webapp connection create storage-blob \
      --new true \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --target-resource-group $RESOURCE_GROUP_NAME \
      --client-type python \
      --system-identity \
      --query configurations[].value \
      --output tsv)
    STORAGE_ACCOUNT_NAME=$(cut -d . -f1 <<< $(cut -d / -f3 <<< $STORAGE_ACCOUNT_URL))
    

Vytvoření kontejneru v účtu úložiště

Ukázková aplikace v Pythonu ukládá fotografie odeslané recenzenty jako blob v kontejneru ve vašem úložném účtu.

  • Když uživatel odešle fotku se svou recenzí, ukázková aplikace uloží snímek do kontejneru pomocí systémem přidělené spravované identity pro ověření a autorizaci. Tuto funkci jste nakonfigurovali v poslední části.

  • Když uživatel zobrazí recenze restaurace, vrátí aplikace odkaz na fotku v úložišti objektů blob pro každou recenzi, která má přidruženou k ní. Aby se fotka zobrazila v prohlížeči, musí k ní mít přístup ve vašem účtu úložiště. Data objektu blob musí být k dispozici pro čtení veřejně prostřednictvím anonymního (neověřeného) přístupu.

Pro zvýšení zabezpečení se účty úložiště vytvářejí s anonymním přístupem k datům objektů blob zakázaným ve výchozím nastavení. V této části povolíte anonymní přístup pro čtení v účtu úložiště a pak vytvoříte kontejner s názvem fotky, který poskytuje veřejný (anonymní) přístup k jeho objektům blob.

  1. Aktualizujte účet úložiště pomocí příkazu az storage account update, aby umožňoval anonymní čtení objektů blob.

    az storage account update \
      --name $STORAGE_ACCOUNT_NAME \
      --resource-group $RESOURCE_GROUP_NAME \
      --allow-blob-public-access true
    

    Povolení anonymního přístupu na účet úložišťové služby nemá vliv na přístup k jednotlivým objektům blob. Veřejný přístup k objektům blob musíte explicitně povolit na úrovni kontejneru.

  2. Vytvořte kontejner s názvem photos v úložném účtu pomocí příkazu az storage container create. Povolit anonymní přístup pro čtení (veřejný) k objektům blob v nově vytvořeném kontejneru.

    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --account-key $(az storage account keys list --account-name $STORAGE_ACCOUNT_NAME \
          --query [0].value --output tsv) 
    

    Poznámka:

    Pro stručnost tento příkaz používá klíč účtu úložiště k autorizaci s účtem úložiště. Ve většině scénářů doporučuje Microsoft používat Microsoft Entra ID a role Řízení přístupu na základě rolí (Azure RBAC) v Azure. Rychlé pokyny najdete v části Rychlý start: Vytvoření, stažení a výpis objektů blob pomocí Azure CLI. Několik rolí Azure umožňuje vytvářet kontejnery v účtu úložiště, včetně vlastníka, přispěvatele, vlastníka dat objektů blob úložiště, a přispěvatele dat objektů blob úložiště.

Další informace o anonymním přístupu pro čtení k datům blobu najdete v tématu Konfigurovat anonymní přístup pro čtení pro kontejnery a objekty blob.

Testování webové aplikace v Pythonu v Azure

Ukázková aplikace v Pythonu používá balíček azure.identity a jeho třídu. Když aplikace běží v Azure, DefaultAzureCredential automaticky zjistí, zda existuje spravovaná identita pro službu App Service, a pokud ano, využije ji k přístupu k dalším prostředkům Azure (v tomto případě úložiště a PostgreSQL). Pro přístup k těmto prostředkům nemusíte zadávat klíče úložiště, certifikáty ani přihlašovací údaje služby App Service.

  1. Přejděte k nasazené aplikaci na URL http://$APP_SERVICE_NAME.azurewebsites.net.

    Spuštění aplikace může trvat minutu nebo dvě. Pokud se zobrazí výchozí stránka aplikace, která není výchozí stránkou ukázkové aplikace, počkejte minutu a aktualizujte prohlížeč.

  2. Otestujte funkčnost ukázkové aplikace přidáním restaurace a několika recenzemi s fotkami pro restauraci.

    Informace o restauracích a recenze jsou uloženy ve službě Azure Database for PostgreSQL a fotky jsou uloženy ve službě Azure Storage. Tady je příklad snímku obrazovky:

    Screenshot of the sample app showing restaurant review functionality using Azure App Service, Azure PostgreSQL Database, and Azure Storage.Snímek obrazovky ukázkové aplikace zobrazující funkci hodnocení restaurace pomocí služby Azure App Service, databáze Azure PostgreSQL a úložiště Azure.

Vyčištění

V tomto kurzu byly všechny prostředky Azure vytvořeny ve stejné skupině prostředků. Odebrání skupiny prostředků pomocí příkazu az group delete odstraní všechny prostředky ve skupině prostředků, a je tak nejrychlejším způsobem, jak odebrat všechny prostředky Azure používané pro vaši aplikaci.

az group delete  --name $RESOURCE_GROUP_NAME 

Volitelně můžete přidat argument --no-wait, který umožní, aby se příkaz vrátil před dokončením operace.

Další kroky

  • Vytvořte a nasazujte webovou aplikaci Django do Azure se spravovanou identitou přiřazenou uživatelem.

  • Nasazení webové aplikace v Pythonu (Django nebo Flask) pomocí PostgreSQL v Azure App Service