Vytvoření a nasazení webové aplikace Django do Azure pomocí spravované identity přiřazené uživatelem

V tomto kurzu nasadíte webovou aplikaci Django do služby Aplikace Azure Service. Webová aplikace používá spravovanou identitu přiřazenou uživatelem (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.

V tomto kurzu vytvoříte spravovanou identitu přiřazenou uživatelem a přiřadíte ji službě App Service, aby získal přístup k prostředkům databáze a účtu úložiště. Příklad použití spravované identity přiřazené systémem najdete v tématu Vytvoření a nasazení webové aplikace Flask Python do Azure se spravovanou identitou přiřazenou systémem. Spravované identity přiřazené uživatelem se doporučují, protože je můžou používat více prostředků a jejich životní cykly jsou oddělené od životních cyklů prostředků, ke kterým jsou přidružené. Další informace o osvědčených postupechjpro použití spravovaných identit najdete v tématu Doporučení osvědčených postupů pro spravované identity.

V tomto kurzu se dozvíte, jak nasadit webovou aplikaci v Pythonu a vytvořit prostředky Azure 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.

Získání ukázkové aplikace

Pomocí ukázkové ukázkové aplikace Django můžete postupovat společně s tímto kurzem. Stáhněte nebo naklonujte ukázkovou aplikaci do vývojového prostředí.

  1. Naklonujte ukázku.

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

    cd msdocs-django-web-app-managed-identity
    

Vytvoření flexibilního 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"
    UA_NAME="UAManagedIdentityPythonTest$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 flexibilní 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 ('\'). Změna znaku pokračování řádku pro ostatní 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 \
      --active-directory-auth Enabled \
      --public-access 0.0.0.0
    

    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. Přidejte svůj účet Azure jako správce Microsoft Entra pro server pomocí příkazu az postgres flexible-server ad-admin create .

    ACCOUNT_EMAIL=$(az ad signed-in-user show --query userPrincipalName --output tsv)
    ACCOUNT_ID=$(az ad signed-in-user show --query id --output tsv)
    echo $ACCOUNT_EMAIL, $ACCOUNT_ID
    az postgres flexible-server ad-admin create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server-name $DB_SERVER_NAME \
      --display-name $ACCOUNT_EMAIL \
      --object-id $ACCOUNT_ID \
      --type User
    
  5. Nakonfigurujte na serveru pravidlo brány firewall pomocí příkazu az postgres flexible-server firewall-rule create . Toto pravidlo umožňuje místnímu prostředí přístup k serveru. (Pokud používáte Azure Cloud Shell, můžete tento krok přeskočit.)

    IP_ADDRESS=<your IP>
    az postgres flexible-server firewall-rule create \
       --resource-group $RESOURCE_GROUP_NAME \
       --name $DB_SERVER_NAME \
       --rule-name AllowMyIP \
       --start-ip-address $IP_ADDRESS \
       --end-ip-address $IP_ADDRESS
    

    Použijte jakýkoli nástroj nebo web, který zobrazuje vaši IP adresu k nahrazení <your IP> v příkazu. Můžete například použít web Co je moje IP adresa?

  6. 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

Spuštěním těchto příkazů v kořenové složce ukázkové aplikace vytvořte službu App Service a nasaďte do ní kód.

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

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --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 ukázkovém ú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"
    

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

Ukázková aplikace ukládá fotky odeslané revidujícím jako objekty blob ve službě Azure Storage.

  • Když uživatel odešle fotku se svou kontrolou, ukázková aplikace zapíše image do kontejneru pomocí spravované identity a DefaultAzureCredential přístupu k účtu úložiště.

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

V této části vytvoříte účet úložiště a kontejner, který umožňuje veřejný přístup pro čtení k objektům blob v kontejneru. V pozdějších částech vytvoříte spravovanou identitu přiřazenou uživatelem a nakonfigurujete ji pro zápis objektů blob do účtu úložiště.

  1. Pomocí příkazu az storage create vytvořte účet úložiště.

    STORAGE_ACCOUNT_NAME="msdocsstorage$RAND_ID"
    az storage account create \
      --name $STORAGE_ACCOUNT_NAME \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --sku Standard_LRS \
      --allow-blob-public-access true
    
  2. Pomocí příkazu az storage container create vytvořte kontejner s názvem fotky v účtu úložiště.

    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login
    

    Poznámka:

    Pokud se příkaz nezdaří, například pokud se zobrazí chyba oznamující, že požadavek může být zablokován síťovými pravidly účtu úložiště, zadejte následující příkaz, abyste měli jistotu, že má váš uživatelský účet Azure přiřazenou roli Azure s oprávněním k vytvoření kontejneru.

    az role assignment create --role "Storage Blob Data Contributor" --assignee $ACCOUNT_EMAIL --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"
    

    Další informace najdete v tématu Rychlý start: Vytvoření, stažení a výpis objektů blob pomocí Azure CLI. 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ě.

Vytvoření spravované identity přiřazené uživatelem

Vytvořte spravovanou identitu přiřazenou uživatelem a přiřaďte ji ke službě App Service. Spravovaná identita se používá pro přístup k databázi a účtu úložiště.

  1. Pomocí příkazu az identity create vytvořte spravovanou identitu přiřazenou uživatelem a vypíšete ID klienta do proměnné pro pozdější použití.

    UA_CLIENT_ID=$(az identity create --name $UA_NAME --resource-group $RESOURCE_GROUP_NAME --query clientId --output tsv)
    echo $UA_CLIENT_ID
    
  2. Pomocí příkazu az account show získejte ID předplatného a vypíšete ho do proměnné, která se dá použít k vytvoření ID prostředku spravované identity.

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$UA_NAME"
    echo $RESOURCE_ID
    
  3. Pomocí příkazu az webapp identity assign přiřaďte spravovanou identitu ke službě App Service.

    export MSYS_NO_PATHCONV=1
    az webapp identity assign \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $APP_SERVICE_NAME \
        --identities $RESOURCE_ID
    
  4. Pomocí příkazu az webapp config appsettings set vytvořte nastavení aplikace služby App Service, která obsahují ID klienta spravované identity a další konfigurační informace.

    az webapp config appsettings set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --settings AZURE_CLIENT_ID=$UA_CLIENT_ID \
        STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME \
        STORAGE_CONTAINER_NAME=photos \
        DBHOST=$DB_SERVER_NAME \
        DBNAME=restaurant \
        DBUSER=$UA_NAME
    

Ukázková aplikace používá proměnné prostředí (nastavení aplikace) k definování informací o připojení pro databázi a účet úložiště, ale tyto proměnné neobsahují hesla. Místo toho se ověřování provádí bez hesla pomocí DefaultAzureCredential.

Kód ukázkové aplikace používá DefaultAzureCredential konstruktor třídy bez předání ID klienta spravované identity přiřazené uživatelem konstruktoru. V tomto scénáři je záložním řešením zkontrolovat proměnnou prostředí AZURE_CLIENT_ID, kterou jste nastavili jako nastavení aplikace.

Pokud proměnná prostředí AZURE_CLIENT_ID neexistuje, použije se spravovaná identita přiřazená systémem, pokud je nakonfigurovaná. Další informace naleznete v tématu Představujeme DefaultAzureCredential.

Vytvoření rolí pro spravovanou identitu

V této části vytvoříte přiřazení rolí pro spravovanou identitu, která umožní přístup k účtu úložiště a databázi.

  1. Vytvořte přiřazení role pro spravovanou identitu, abyste umožnili přístup k účtu úložiště pomocí příkazu az role assignment create .

    export MSYS_NO_PATHCONV=1
    az role assignment create \
    --assignee $UA_CLIENT_ID \
    --role "Storage Blob Data Contributor" \
    --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCE_GROUP_NAME"
    

    Příkaz určuje rozsah přiřazení role ke skupině prostředků. Další informace najdete v tématu Vysvětlení přiřazení rolí.

  2. Pomocí příkazu az postgres flexible-server execute se připojte k databázi Postgres a spuštěním stejných příkazů přiřaďte spravované identitě role.

    ACCOUNT_EMAIL_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)
    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ACCOUNT_EMAIL \
      --admin-password $ACCOUNT_EMAIL_TOKEN \
      --database-name postgres \
      --querytext "select * from pgaadauth_create_principal('"$UA_NAME"', false, false);select * from pgaadauth_list_principals(false);"
    

    Pokud máte potíže se spuštěním příkazu, ujistěte se, že jste uživatelský účet přidali jako správce Microsoft Entra pro server PosgreSQL a že jste povolili přístup ke své IP adrese v pravidlech brány firewall. Další informace najdete v části Vytvoření flexibilního serveru Azure PostgreSQL.

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