Sdílet prostřednictvím


Nasazení kontejnerizované aplikace v Pythonu do služby App Service

V této části série kurzů se naučíte nasadit kontejnerizovanou webovou aplikaci Pythonu do služby Azure App Service Web App for Containers. Tato plně spravovaná služba umožňuje spouštět kontejnerizované aplikace bez nutnosti udržovat vlastní orchestrátor kontejnerů.

App Service zjednodušuje nasazování prostřednictvím kanálů kontinuální integrace a průběžného nasazování (CI/CD), které fungují s Docker Hubem, Azure Container Registry, Azure Key Vaultem a dalšími nástroji DevOps. Tento kurz je 4. částí 5dílné série kurzů.

Na konci tohoto článku máte zabezpečenou a produkční webovou aplikaci App Service spuštěnou z image kontejneru Dockeru. Aplikace používá spravovanou identitu přiřazenou systémem k načtení image ze služby Azure Container Registry a načtení tajných kódů ze služby Azure Key Vault.

Tento diagram služby zvýrazňuje součásti popsané v tomto článku.

Snímek obrazovky se službami, které používají v kurzu – Kontejnerizovaná aplikace Pythonu v Azure se zvýrazněnou cestou nasazení

Příkazy Azure CLI je možné spouštět v Azure Cloud Shellu nebo na místním počítači s nainstalovaným Azure CLI.

Důležitý

Pro všechny kroky založené na rozhraní příkazového řádku v tomto kurzu doporučujeme použít Azure Cloud Shell , protože:

  • Dodává se předem ověřený s vaším účtem Azure a zabraňuje problémům s přihlášením.
  • Obsahuje všechna požadovaná rozšíření Azure CLI.
  • Zajišťuje konzistentní chování bez ohledu na místní operační systém nebo prostředí.
  • Nevyžaduje žádnou místní instalaci, ideální pro uživatele bez práv správce.
  • Poskytuje přímý přístup ke službám Azure z portálu – nevyžaduje se žádné nastavení místního Dockeru ani sítě.
  • Zabraňuje problémům s místní bránou firewall nebo konfigurací sítě.

Vytvoření služby Key Vault s autorizací RBAC

Azure Key Vault je zabezpečená služba pro ukládání tajných kódů, klíčů rozhraní API, připojovacích řetězců a certifikátů. V tomto skriptu uloží připojovací řetězec MongoDB a webovou aplikaci SECRET_KEY.

Služba Key Vault je nakonfigurovaná tak, aby místo tradičních zásad přístupu používala řízení přístupu na základě role (RBAC) role Azure. Webová aplikace používá spravovanou identitu přiřazenou systémem k zabezpečenému načítání tajných kódů za běhu.

Poznámka

Vytvořením služby Key Vault brzy zajistíte, že role budou možné přiřadit dříve, než se pokusíte získat přístup k tajným kódům. Pomáhá také vyhnout se zpožděním propagace při přiřazování rolí. Vzhledem k tomu, že služba Key Vault nezávisí na službě App Service, zřiďte ji v rané fázi, což zvyšuje spolehlivost a sekvencování.

  1. V tomto kroku použijete příkaz az keyvault create k vytvoření služby Azure Key Vault s povoleným RBAC.

    #!/bin/bash
    RESOURCE_GROUP_NAME="msdocs-web-app-rg"
    LOCATION="westus"
    KEYVAULT_NAME="${RESOURCE_GROUP_NAME}-kv"
    
    az keyvault create \
      --name "$KEYVAULT_NAME" \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --location "$LOCATION" \
      --enable-rbac-authorization true
    

Vytvořte plán služby App Service a webovou aplikaci

Plán služby App Service definuje výpočetní prostředky, cenovou úroveň a oblast vaší webové aplikace. Webová aplikace spouští kontejnerizovanou aplikaci a zřídí se se spravovanou identitou přiřazenou systémem, která se používá k bezpečnému ověření ve službě Azure Container Registry (ACR) a službě Azure Key Vault.

V tomto kroku provedete následující úlohy:

  • Vytvořte plán služby App Service
  • Vytvoření webové aplikace se spravovanou identitou
  • Nakonfigurujte webovou aplikaci pro nasazení pomocí konkrétního obrazu kontejneru
  • Příprava na průběžné nasazování prostřednictvím ACR

Poznámka

Webová aplikace se musí vytvořit před přiřazením přístupu ke službě ACR nebo Key Vault, protože spravovaná identita se vytvoří jenom v době nasazení. Přiřazení image kontejneru během vytváření také zajišťuje správné spuštění aplikace s zamýšlenou konfigurací.

  1. V tomto kroku pomocí příkazu az appservice plan create zřídíte výpočetní prostředí pro vaši aplikaci.

    #!/bin/bash
    APP_SERVICE_PLAN_NAME="msdocs-web-app-plan"
    
    az appservice plan create \
        --name "$APP_SERVICE_PLAN_NAME" \
        --resource-group "$RESOURCE_GROUP_NAME" \
        --sku B1 \
        --is-linux
    
  2. V tomto kroku pomocí příkazu az webapp create vytvoříte webovou aplikaci. Tento příkaz také umožňuje spravovanou identitu přiřazenou systémem a nastaví image kontejneru, kterou aplikace spouští.

    #!/bin/bash
    APP_SERVICE_NAME="msdocs-website-name" #APP_SERVICE_NAME must be globally unique as it becomes the website name in the URL `https://<website-name>.azurewebsites.net`.
    # Use the same registry name as in part 2 of this tutorial series.
    REGISTRY_NAME="msdocscontainerregistryname" #REGISTRY_NAME is the registry name you used in part 2 of this tutorial.
    CONTAINER_NAME="$REGISTRY_NAME.azurecr.io/msdocspythoncontainerwebapp:latest" #CONTAINER_NAME is of the form "yourregistryname.azurecr.io/repo_name:tag".
    
    az webapp create \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --plan "$APP_SERVICE_PLAN_NAME" \
      --name "$APP_SERVICE_NAME" \
      --assign-identity '[system]' \
      --deployment-container-image-name "$CONTAINER_NAME" 
    

    Poznámka

    Při spuštění tohoto příkazu se může zobrazit následující chyba:

    No credential was provided to access Azure Container Registry. Trying to look up...
    Retrieving credentials failed with an exception:'Failed to retrieve container registry credentials. Please either provide the credentials or run 'az acr update -n msdocscontainerregistryname --admin-enabled true' to enable admin first.'
    

    K této chybě dochází, protože se webová aplikace pokusí použít přihlašovací údaje správce pro přístup k ACR, které přihlašovací údaje jsou ve výchozím nastavení zakázané. Tuto zprávu můžete ignorovat: V dalším kroku nakonfigurujete webovou aplikaci tak, aby používala spravovanou identitu k ověření pomocí ACR.

Udělení role strážce tajných kódů přihlášeným uživatelům

Aby uživatel, který spouští skript, ukládal tajné kódy do Azure Key Vault, musí mít roli Důstojník pro tajné kódy Key Vault. Tato role umožňuje vytvářet a spravovat tajné kódy v rámci trezoru.

V tomto kroku skript přiřadí tuto roli aktuálně přihlášeným uživatelům. Tento uživatel pak může bezpečně ukládat tajné kódy aplikace, jako je připojovací řetězec MongoDB a aplikace SECRET_KEY.

Toto přiřazení role je první ze dvou přiřazení rolí souvisejících se službou Key Vault. Později se spravované identitě přiřazené systémem webové aplikace udělí přístup k načtení tajných kódů z trezoru.

Použití Azure RBAC zajišťuje zabezpečený, auditovatelný přístup na základě identity a eliminuje potřebu pevně zakódovaných přihlašovacích údajů.

Poznámka

Před pokusem o uložení tajných kódů do trezoru klíčů musí být uživateli přiřazena roleSprávce tajných kódů služby Key Vault. Toto přiřazení se provádí pomocí příkazu az role assignment create v rozsahu služby Key Vault.

  1. V tomto kroku použijete příkaz az role assignment create k přiřazení role v oboru Key Vault.

    #!/bin/bash
    CALLER_ID=$(az ad signed-in-user show --query id -o tsv)
    echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully.
    
    az role assignment create \
      --role "Key Vault Secrets Officer" \
      --assignee "$CALLER_ID" \
      --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
    
    

Udělení webového přístupu ke službě ACR pomocí spravované identity

Aby bylo možné bezpečně načíst image ze služby Azure Container Registry (ACR), musí být webová aplikace nakonfigurovaná tak, aby používala spravovanou identitu přiřazenou systémem. Použití spravované identity zabraňuje nutnosti přihlašovacích údajů správce a podporuje zabezpečené nasazení bez přihlašovacích údajů.

Tento proces zahrnuje dvě klíčové akce:

  • Povolení použití spravované identity webové aplikace při přístupu k ACR
  • Přiřazení role AcrPull k této identitě v cílové službě ACR
  1. V tomto kroku načtete hlavní ID (jedinečné ID objektu) spravované identity webové aplikace s využitím příkazu az webapp identity show. Dále povolíte použití spravované identity pro ověřování ACR nastavením vlastnosti acrUseManagedIdentityCreds na true pomocí příkazu az webapp config set. Potom přiřadíte roli AcrPull spravované identitě webové aplikace pomocí příkazu az role assignment create . Tato role uděluje webové aplikaci oprávnění k načtení imagí z registru.

    #!/bin/bash
    PRINCIPAL_ID=$(az webapp identity show \
      --name "$APP_SERVICE_NAME" \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --query principalId \
      -o tsv)
    echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful 'AcrPull' role assignment using `az role assignment list`.    
    
    az webapp config set \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --name "$APP_SERVICE_NAME" \
      --generic-configurations '{"acrUseManagedIdentityCreds": true}'
    
    az role assignment create \
    --role "AcrPull" \
    --assignee "$PRINCIPAL_ID" \
    --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ContainerRegistry/registries/$REGISTRY_NAME"
    
    

Poskytnutí přístupu k trezoru klíčů pro spravovanou identitu webové aplikace

Webová aplikace potřebuje oprávnění pro přístup k tajemstvím, jako je připojovací řetězec MongoDB a SECRET_KEY. Pokud chcete tato oprávnění udělit, musíte přiřadit roli uživatele tajných kódů služby Key Vault k spravované identitě přiřazené systémem pro webovou aplikaci.

  1. V tomto kroku použijete jedinečný identifikátor (hlavní ID) systémem přiřazené spravované identity webové aplikace k udělení přístupu webové aplikaci ke Key Vault s rolí Key Vault Secrets User pomocí příkazu az role assignment create.

    #!/bin/bash
    
    az role assignment create \
    --role "Key Vault Secrets User" \
    --assignee "$PRINCIPAL_ID" \
    --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
    

Ukládání tajných kódů ve službě Key Vault

Abyste se vyhnuli pevně zakódování tajných kódů ve vaší aplikaci, uloží tento krok připojovací řetězec MongoDB a tajný klíč webové aplikace do služby Azure Key Vault. Tyto tajné kódy pak může webová aplikace bezpečně přistupovat za běhu prostřednictvím své spravované identity, aniž by bylo nutné ukládat přihlašovací údaje v kódu nebo konfiguraci.

Poznámka

I když tento kurz ukládá pouze připojovací řetězec a tajný klíč do trezoru klíčů, můžete volitelně uložit i další nastavení aplikace, jako je název databáze MongoDB nebo název kolekce ve službě Key Vault.

  1. V tomto kroku použijete příkaz az cosmosdb keys list k načtení připojovacího řetězce MongoDB. Příkazem az keyvault secret set pak uložíte připojovací řetězec i náhodně vygenerovaný tajný klíč ve službě Key Vault.

    #!/bin/bash
    ACCOUNT_NAME="msdocs-cosmos-db-account-name"
    
    MONGO_CONNECTION_STRING=$(az cosmosdb keys list \
      --name "$ACCOUNT_NAME" \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --type connection-strings \
      --query "connectionStrings[?description=='Primary MongoDB Connection String'].connectionString" -o tsv)
    
    SECRET_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9')
    # This key is cryptographically secure, using OpenSSL’s strong random number generator.
    
    az keyvault secret set \
      --vault-name "$KEYVAULT_NAME" \
      --name "MongoConnectionString" \
      --value "$MONGO_CONNECTION_STRING"
    
    az keyvault secret set \
      --vault-name "$KEYVAULT_NAME" \
      --name "MongoSecretKey" \
      --value "$SECRET_KEY"
    

Konfigurace webové aplikace pro použití tajných kódů služby Kay Vault

Aby bylo možné bezpečně přistupovat k tajným kódům za běhu, musí být webová aplikace nakonfigurovaná tak, aby odkazovala na tajné kódy uložené ve službě Azure Key Vault. Tento krok se provádí pomocí odkazů služby Key Vault, které do prostředí aplikace vloží hodnoty tajných kódů prostřednictvím spravované identity přiřazené systémem.

Tento přístup zabraňuje pevně zakódování tajných kódů a umožňuje aplikaci bezpečně načítat citlivé hodnoty, jako je připojovací řetězec MongoDB a tajný klíč během provádění.

  1. V tomto kroku pomocí příkazu az webapp config appsettings set přidáte nastavení aplikace, která odkazují na tajné kódy služby Key Vault. Konkrétně to nastavuje nastavení aplikací MongoConnectionString a MongoSecretKey tak, aby odkazovalo na odpovídající tajemství uložená ve službě Key Vault.

    #!/bin/bash
    MONGODB_NAME="restaurants_reviews"
    MONGODB_COLLECTION_NAME="restaurants_reviews"
    
    az webapp config appsettings set \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --name "$APP_SERVICE_NAME" \
      --settings \
          CONNECTION_STRING="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoConnectionString)" \
          SECRET_KEY="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)" \
          DB_NAME="$MONGODB_NAME" \
          COLLECTION_NAME="$MONGODB_COLLECTION_NAME"
    

Povolení průběžného nasazování z ACR

Povolení průběžného nasazování umožňuje webové aplikaci automaticky vyžádat a spustit nejnovější image kontejneru při každém odeslání do služby Azure Container Registry (ACR). To snižuje kroky ručního nasazení a pomáhá zajistit, aby vaše aplikace zůstala aktuální.

Poznámka

V dalším kroku zaregistrujete webhook ve službě ACR, který upozorní webovou aplikaci, když se odešle nová image.

  1. V tomto kroku pomocí příkazu az webapp deployment container config povolíte průběžné nasazování z ACR do webové aplikace.

    #!/bin/bash
    az webapp deployment container config \
      --name "$APP_SERVICE_NAME" \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --enable-cd true
    

Registrace webhooku ACR pro průběžné nasazování

Pokud chcete automatizovat nasazení, zaregistrujte webhook ve službě Azure Container Registry (ACR), který webovou aplikaci upozorní pokaždé, když se odešle nová image kontejneru. Webhook umožňuje aplikaci automaticky vyžádat a spustit nejnovější verzi.

Webhook nakonfigurovaný ve službě Azure Container Registry (ACR) odešle požadavek POST do koncového bodu SCM webové aplikace (SERVICE_URI) při každém odeslání nové image do úložiště msdocspythoncontainerwebapp. Tato akce aktivuje webovou aplikaci, která stáhne a nasadí aktualizovanou image a dokončí kanál průběžného nasazování mezi ACR a Azure App Service.

Poznámka

Identifikátor URI webhooku musí mít tento formát:
https://<app-name>.scm.azurewebsites.net/api/registry/webhook

Musí končit/api/registry/webhook. Pokud se zobrazí chyba identifikátoru URI, ověřte, že je cesta správná.

  1. V tomto kroku pomocí příkazu az acr webhook create zaregistrujte webhook a nakonfigurujte ho pro aktivaci push událostí.

    #!/bin/bash
    CREDENTIAL=$(az webapp deployment list-publishing-credentials \
        --resource-group "$RESOURCE_GROUP_NAME" \
        --name "$APP_SERVICE_NAME" \
        --query publishingPassword --output tsv)
    # Web app publishing credentials may not be available immediately. In production, poll until non-empty.   
    
    SERVICE_URI="https://$APP_SERVICE_NAME:$CREDENTIAL@$APP_SERVICE_NAME.scm.azurewebsites.net/api/registry/webhook"
    
    az acr webhook create \
      --name webhookforwebapp \
      --registry "$REGISTRY_NAME" \
      --scope msdocspythoncontainerwebapp:* \
      --uri "$SERVICE_URI" \
      --actions push
    
    

Procházení webu

Pokud chcete ověřit, že je webová aplikace spuštěná, otevřete https://<website-name>.azurewebsites.net a nahraďte <website-name> názvem vaší služby App Service. Měla by se zobrazit ukázková aplikace pro kontrolu restaurace. První načtení může chvíli trvat.

Jakmile se web zobrazí, zkuste přidat restauraci a odeslat recenzi, abyste potvrdili, že aplikace funguje správně.

Poznámka

Příkaz az webapp browse není v Cloud Shellu podporovaný. Pokud používáte Cloud Shell, otevřete ručně prohlížeč a přejděte na adresu URL webu.

Pokud používáte Azure CLI místně, můžete web otevřít ve výchozím prohlížeči pomocí příkazu az webapp browse :

az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME

Poznámka

Příkaz az webapp browse není v Cloud Shellu podporovaný. Otevřete okno prohlížeče a přejděte na adresu URL webu.

Řešení problémů s nasazením

Pokud ukázkovou aplikaci nevidíte, vyzkoušejte následující kroky.

  • S nasazením kontejnerů a službou App Service vždy zkontrolujte stránkuProtokoly / na webu Azure Portal. Ověřte, že kontejner byl stažen a je spuštěný. Počáteční stažení a spuštění kontejneru může trvat několik okamžiků.
  • Zkuste službu App Service restartovat a zjistěte, jestli se tím váš problém vyřeší.
  • Pokud dojde k chybám programování, zobrazí se tyto chyby v protokolech aplikace. Na stránce webu Azure Portal pro službu App Service vyberte Diagnostikovat a řešit problémy/Protokoly aplikací.
  • Ukázková aplikace spoléhá na připojení ke službě Azure Cosmos DB pro MongoDB. Ověřte, že služba App Service má nastavení aplikace se správnými informacemi o připojení.
  • Ověřte, že je pro službu App Service povolena spravovaná identita a že se používá v Centru nasazení. Na stránce webu Azure Portal pro službu App Service přejděte k prostředku služby App Service Deployment Center a ověřte, že je ověřování nastavené na spravovanou identitu.
  • Zkontrolujte, jestli je webhook definovaný ve službě Azure Container Registry. Webhook umožňuje službě App Service vyžádat image kontejneru. Konkrétně zkontrolujte, že identifikátor URI služby končí na /api/registry/webhook. Pokud ne, přidejte ho.
  • Různé varianty Azure Container Registry mají různé funkce, včetně počtu webhooků. Pokud používáte existující registr, může se zobrazit zpráva: "Kvóta byla překročena pro webhooky pro SKU registru Basic. Další informace o různých kvótách skladových položek a procesu upgradu: https://aka.ms/acr/tiers". Pokud se tato zpráva zobrazí, použijte nový registr nebo snižte počet užitých webhooků registru .

Další krok