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 pro vytvoření a nasazení webové aplikace spuštěné ve službě Aplikace Azure Service. Webová aplikace používá spravovanou identitu přiřazenou systémem (bez hesla) s řízením přístupu na základě role v Azure pro přístup k prostředkům flexibilního serveru Azure Storage a Azure Database for PostgreSQL. Kód používá defaultAzureCredential třídy klientské knihovny Azure Identity pro Python. Třída DefaultAzureCredential automaticky zjistí, že spravovaná identita existuje pro službu App Service a používá ji pro přístup 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 hesel najdete v tématu Připojení bez hesla pro služby Azure. Informace o konektoru služby najdete v dokumentaci ke konektoru služby.

V tomto kurzu se dozvíte, jak vytvořit a nasadit webovou aplikaci v Pythonu pomocí Azure CLI. Příkazy v tomto kurzu se zapisují tak, aby se spouštěly v prostředí Bash. Příkazy kurzu můžete spouštět v jakémkoli prostředí Bash s nainstalovaným rozhraním příkazového řádku, jako je místní prostředí nebo Azure Cloud Shell. S některými úpravami – například nastavením a používáním proměnných prostředí – můžete tyto příkazy spustit v jiných prostředích, jako je příkazové prostředí Windows. Příklady použití spravované identity přiřazené uživatelem najdete v tématu Vytvoření a nasazení webové aplikace Django do Azure pomocí spravované identity přiřazené 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ázku v relaci Azure Cloud Shellu.

    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 flexibilního serveru Azure Database for PostgreSQL, ve které ukládá restaurace a recenze.

K ověření v obou úložištích dat používá DefaultAzureCredential . Aplikace DefaultAzureCredentialse dá nakonfigurovat tak, aby běžela pod identitou různých instančních objektů v závislosti na prostředí, ve kterém je spuštěná, bez nutnosti provádět změny kódu. 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á, aby prováděla akce s prostředkem, který aplikace 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í odpovídající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ě objektů blob pro nahrání fotek do app.py. Instance DefaultAzureCredential je poskytována klientovi, který používá k 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 se také používá k získání přístupového DefaultAzureCredential tokenu pro Službu Azure Database for PostgreSQL v ./azureproject/get_conn.py. V tomto případě se token získá přímo voláním get_token instance přihlašovacích údajů a předáním příslušné scope hodnoty. Token se pak použije místo hesla v identifikátoru URI připojení PostgreSQL vráceného 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 DefaultAzureCredentialtom, 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 neosamocené znaky. Při vytváření uživatelských jmen nebo hesel znak nepoužívejte$. Později vytvoříte proměnné prostředí s těmito hodnotami, ve kterých $ má znak speciální význam v kontejneru Linuxu, který se používá ke spouštění aplikací v 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 prostředí.)

    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 skladové položky je název cenové úrovně a konfigurace výpočetních prostředků. 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.

  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
    

    Skladová položka definuje velikost (procesor, paměť) a náklady na plán služby App Service. Za plán služby B1 (Basic) se ve vašem předplatném Azure účtují malé náklady. Úplný seznam plánů služby App Service najdete na stránce s cenami 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 služby storage 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 objektů blob služby Storage 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á fotky odeslané revidujícím jako objekty blob v kontejneru ve vašem účtu úložiště.

  • Když uživatel odešle fotku se svou kontrolou, ukázková aplikace zapíše image do kontejneru pomocí spravované identity přiřazené systémem pro ověřování 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é poskytují veřejný (anonymní) přístup k jeho objektům blob.

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

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

    Povolení anonymního přístupu v účtu úložiště nemá vliv na přístup pro jednotlivé objekty blob. Veřejný přístup k objektům blob musíte explicitně povolit na úrovni kontejneru.

  2. Pomocí příkazu az storage container create vytvořte kontejner s názvem fotky v účtu úložiště. 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ě. Pro většinu scénářů doporučuje Microsoft používat role Microsoft Entra ID a Azure (RBAC). Rychlý start: Vytvoření, stažení a výpis objektů blob pomocí Azure CLI najdete v rychlém startu. Všimněte si, že 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 objektů blob najdete v tématu Konfigurace anonymního přístupu 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 její DefaultAzureCredential třídu. Když je aplikace spuštěná v Azure, automaticky zjistí, DefaultAzureCredential jestli pro službu App Service existuje spravovaná identita, a pokud ano, použije ji pro přístup 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 na nasazenou aplikaci na adrese 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.

    Restaurace a kontrola informací se ukládají ve službě Azure Database for PostgreSQL a fotky se ukládají ve službě Azure Storage. Tady je příklad snímku obrazovky:

    Snímek obrazovky ukázkové aplikace zobrazující funkce kontroly restaurace pomocí služby Aplikace Azure Service, Azure PostgreSQL Database a Azure Storage

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ů odebere příkazem az group delete všechny prostředky ve skupině prostředků a je nejrychlejší způsob, 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 --no-wait argument, který umožní, aby se příkaz vrátil před dokončením operace.

Další kroky