Megosztás a következőn keresztül:


Tárolóalapú Python-alkalmazás üzembe helyezése az App Service-ben

Az oktatóanyag-sorozat jelen részében megtudhatja, hogyan helyezhet üzembe egy tárolóalapú Python-webalkalmazást az Azure App Service Web App for Containersben. Ez a teljes körűen felügyelt szolgáltatás lehetővé teszi a tárolóalapú alkalmazások futtatását anélkül, hogy saját tárolóvezénylőt kellene fenntartania.

Az App Service a Docker Hub, az Azure Container Registry, az Azure Key Vault és más DevOps-eszközök használatával működő folyamatos integrációs/folyamatos üzembe helyezési (CI/CD) folyamatokkal egyszerűsíti az üzembe helyezést. Ez az oktatóanyag egy 5 részes oktatóanyag-sorozat 4. része.

A cikk végén egy biztonságos, éles üzemre kész App Service-webalkalmazással rendelkezik, amely egy Docker-tárolórendszerképből fut. Az alkalmazás rendszer által hozzárendelt felügyelt identitással kéri le a rendszerképet az Azure Container Registryből, és titkos kulcsokat kér le az Azure Key Vaultból.

Ez a szolgáltatásdiagram a cikkben tárgyalt összetevőket emeli ki.

Képernyőkép az Oktatóanyagban használt szolgáltatásokról – Tárolókban futó Python-alkalmazás az Azure-on, az üzembe helyezési útvonal kiemelésével.

Az Azure CLI-parancsok futtathatók az Azure Cloud Shellben vagy egy helyi gépen, amelyen telepítve van az Azure CLI.

Fontos

Javasoljuk, hogy az oktatóanyag összes CLI-alapú lépéséhez használja az Azure Cloud Shellt , mert:

  • Az Azure-fiókjával már előre hitelesítve van, így elkerülheti a bejelentkezési problémákat.
  • A dobozon kívül található összes szükséges Azure CLI-bővítményt tartalmazza
  • Konzisztens működést biztosít a helyi operációs rendszertől vagy környezettől függetlenül
  • Nincs szükség helyi telepítésre, ideális rendszergazdai jogosultságokkal nem rendelkező felhasználók számára
  • Közvetlen hozzáférést biztosít az Azure-szolgáltatásokhoz a portálról – nincs szükség helyi Dockerre vagy hálózatbeállításra
  • Elkerüli a helyi tűzfal- vagy hálózati konfigurációs problémákat

Key Vault létrehozása RBAC-hitelesítéssel

Az Azure Key Vault egy biztonságos szolgáltatás titkos kulcsok, API-kulcsok, kapcsolati sztringek és tanúsítványok tárolására. Ebben a szkriptben a MongoDB kapcsolati sztringet és a webalkalmazás SECRET_KEY elemét tárolja.

A Key Vault úgy van konfigurálva, hogy a hagyományos hozzáférési szabályzatok helyett szerepköralapú hozzáférés-vezérlést (RBAC) használjon a hozzáférés Azure-szerepkörökön keresztüli kezelésére. A webalkalmazás a rendszer által hozzárendelt felügyelt identitással kéri le a titkos kulcsokat biztonságosan futásidőben.

Jegyzet

A Key Vault korai létrehozása biztosítja, hogy a szerepkörök a titkos kulcsokhoz való hozzáférés bármilyen kísérlete előtt hozzárendelhetők legyenek. Emellett segít elkerülni a szerepkör-hozzárendelések propagálási késését. Mivel a Key Vault nem az App Service-től függ, a korai üzembe helyezés javítja a megbízhatóságot és a szekvenálást.

  1. Ebben a lépésben az az keyvault create paranccsal hozhat létre egy Azure Key Vaultot, amelyen engedélyezve van az 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
    

Az App Service-csomag és a webalkalmazás létrehozása

Az App Service-csomag határozza meg a webalkalmazás számítási erőforrásait, tarifacsomagját és régióját. A webalkalmazás futtatja a tárolóalapú alkalmazást, és egy rendszer által hozzárendelt felügyelt identitással van kiépítve, amely az Azure Container Registry (ACR) és az Azure Key Vault biztonságos hitelesítésére szolgál.

Ebben a lépésben a következő feladatokat hajtja végre:

  • App Service-csomag létrehozása
  • A webalkalmazás létrehozása a felügyelt identitással
  • A webalkalmazás konfigurálása egy adott tárolórendszerkép használatával történő üzembe helyezésre
  • Felkészülés a folyamatos üzembe helyezésre az ACR-en keresztül

Jegyzet

A webalkalmazást az ACR-hez vagy a Key Vaulthoz való hozzáférés hozzárendelése előtt kell létrehozni, mert a felügyelt identitás csak az üzembe helyezéskor jön létre. Emellett a tárolólemezkép hozzárendelése a létrehozás során biztosítja, hogy az alkalmazás megfelelően induljon el a kívánt konfigurációval.

  1. Ebben a lépésben az az appservice plan create paranccsal hozza létre az alkalmazás számítási környezetét.

    #!/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. Ebben a lépésben az az webapp create paranccsal hozza létre a webalkalmazást. Ez a parancs egy rendszer által hozzárendelt felügyelt identitást is lehetővé tesz, és beállítja az alkalmazás által futtatott tárolórendszerképet.

    #!/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" 
    

    Jegyzet

    A parancs futtatásakor a következő hibaüzenet jelenhet meg:

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

    Ez a hiba azért fordul elő, mert a webalkalmazás rendszergazdai hitelesítő adatokkal próbál hozzáférni az ACR-hez, amelyek alapértelmezés szerint le vannak tiltva. Nyugodtan figyelmen kívül hagyhatja ezt az üzenetet: a következő lépés úgy konfigurálja a webalkalmazást, hogy a felügyelt identitását használja az ACR-hitelesítéshez.

Titkos kódokért felelős tisztviselői szerepkör biztosítása bejelentkezett felhasználónak

Ha titkos kulcsokat szeretne tárolni az Azure Key Vaultban, a szkriptet futtató felhasználónak rendelkeznie kell a Key Vault titkos kulcskezelő szerepkörével. Ez a szerepkör lehetővé teszi a titkos kulcsok létrehozását és kezelését a tárolóban.

Ebben a lépésben a szkript hozzárendeli ezt a szerepkört az aktuálisan bejelentkezett felhasználóhoz. Ez a felhasználó ezután biztonságosan tárolhatja az alkalmazás titkos kulcsát, például a MongoDB kapcsolati sztringjét és az alkalmazás titkos kódját SECRET_KEY.

Ez a szerepkör-hozzárendelés a Key Vaulthoz kapcsolódó két szerepkör-hozzárendelés közül az első. Később a webalkalmazás rendszer által hozzárendelt felügyelt identitása hozzáférést kap a titkos kódok lekéréséhez a tárolóból.

Az Azure RBAC használata biztosítja az identitáson alapuló biztonságos, naplózható hozzáférést, így nincs szükség szigorúan kódolt hitelesítő adatokra.

Jegyzet

Mielőtt megkísérli tárolni a titkokat a kulcstartóban, a felhasználónak hozzá kell rendelnie a Key Vault titkos kulcskezelőszerepkörét. Ez a feladat a Key Vault hatókörébe tartozó az szerepkör-hozzárendelés létrehozása parancs segítségével történik.

  1. Ebben a lépésben az az role assignment create paranccsal rendeli hozzá a szerepkört a Key Vault hatóköréhez.

    #!/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"
    
    

Webes hozzáférés biztosítása az ACR-hez felügyelt identitás használatával

Az Azure Container Registry (ACR) rendszerképeinek biztonságos lekéréséhez a webalkalmazást úgy kell konfigurálni, hogy a rendszer által hozzárendelt felügyelt identitást használja. A felügyelt identitás használata elkerüli a rendszergazdai hitelesítő adatok szükségességét, és támogatja a biztonságos, hitelesítő adatok nélküli üzembe helyezést.

Ez a folyamat két fő műveletből áll:

  • A webalkalmazás felügyelt identitásának engedélyezése az ACR elérésekor
  • Az AcrPull-szerepkör hozzárendelése ehhez az identitáshoz a cél ACR-en
  1. Ebben a lépésben lekéri a webalkalmazás felügyelt identitásának egyszerű azonosítóját (egyedi objektumazonosítóját) az az webapp identity show paranccsal. Ezután engedélyezi a felügyelt identitás használatát az ACR-hitelesítéshez azzal, hogy az acrUseManagedIdentityCreds tulajdonságot beállítja true használatára, az az webapp config set parancs segítségével. Ezután az az szerepkör-hozzárendelés létrehozási parancsával hozzárendelheti az AcrPull-szerepkört a webalkalmazás felügyelt identitásához. Ez a szerepkör engedélyezi a webalkalmazásnak, hogy képeket kérjen le a beállításjegyzékből.

    #!/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"
    
    

Kulcstartó-hozzáférés biztosítása a webalkalmazás felügyelt identitásához

A webalkalmazásnak engedélyre van szüksége olyan titkos kódok eléréséhez, mint a MongoDB kapcsolati sztring és a SECRET_KEY. Az engedélyek megadásához hozzá kell rendelnie a Key Vault titkos kulcsfelhasználói szerepkörét a webalkalmazás rendszer által hozzárendelt felügyelt identitásához.

  1. Ebben a lépésben a webalkalmazás rendszer által hozzárendelt felügyelt identitásának egyedi azonosítójával (egyszerű azonosítójával) biztosít hozzáférést a webalkalmazásnak a Key Vaulthoz a Key Vault titkos kulcsfelhasználói szerepkörével az az role assignment create paranccsal.

    #!/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"
    

Titkos kulcsok tárolása a Key Vaultban

A titkok kemény kódolásának elkerülése érdekében ez a lépés az MongoDB kapcsolati sztringjét és a webalkalmazás titkos kulcsát az Azure Key Vault-ban tárolja. Ezeket a titkos kulcsokat ezután a webalkalmazás biztonságosan elérheti futtatókörnyezetben a felügyelt identitásán keresztül anélkül, hogy a hitelesítő adatokat kódban vagy konfigurációban kellene tárolnia.

Jegyzet

Bár ez az oktatóanyag csak a kapcsolati sztringet és a titkos kulcsot tárolja a kulcstartóban, más alkalmazásbeállításokat is tárolhat, például a MongoDB-adatbázis nevét vagy a gyűjtemény nevét a Key Vaultban.

  1. Ebben a lépésben az az cosmosdb keys list paranccsal kéri le a MongoDB kapcsolati sztringet. Ezután az az keyvault titkos kulcskészlet parancsával a kapcsolati sztringet és a véletlenszerűen létrehozott titkos kulcsot is tárolhatja a Key Vaultban.

    #!/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"
    

Webalkalmazás konfigurálása Kay Vault-titkos kódok használatára

A titkos kódok futásidőben történő biztonságos eléréséhez a webalkalmazást úgy kell konfigurálni, hogy hivatkozzon az Azure Key Vaultban tárolt titkos kódokra. Ez a lépés Key Vault-referenciák használatával történik, amelyek a rendszer által hozzárendelt felügyelt identitáson keresztül injektálják a titkos értékeket az alkalmazás környezetébe.

Ez a megközelítés elkerüli a titkos kódok korlátozását, és lehetővé teszi, hogy az alkalmazás biztonságosan lekérje az olyan bizalmas értékeket, mint a MongoDB kapcsolati sztring és a titkos kulcs a végrehajtás során.

  1. Ebben a lépésben az az webapp config appsettings set paranccsal adja hozzá a Key Vault titkos kulcsokra hivatkozó alkalmazásbeállításokat. Az MongoConnectionString és MongoSecretKey alkalmazásbeállításokat úgy állítja be, hogy a Key Vaultban tárolt megfelelő titkokra hivatkozzanak.

    #!/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"
    

Folyamatos üzembe helyezés engedélyezése az ACR-ből

A folyamatos üzembe helyezés engedélyezése lehetővé teszi, hogy a webalkalmazás automatikusan lekérje és futtassa a legújabb tárolórendszerképet, amikor egy leküldés történik az Azure Container Registrybe (ACR). Ez csökkenti a manuális üzembe helyezés lépéseit, és segít biztosítani, hogy az alkalmazás naprakész maradjon.

Jegyzet

A következő lépésben regisztrál egy webhookot az ACR-ben, hogy értesítést küldjön a webalkalmazásnak, amikor új képet töltenek fel.

  1. Ebben a lépésben az az webapp deployment container config paranccsal engedélyezheti a folyamatos üzembe helyezést az ACR-ből a webalkalmazásba.

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

ACR Webhook regisztrálása folyamatos üzembe helyezéshez

Az üzembe helyezés automatizálásához regisztráljon egy webhookot az Azure Container Registryben (ACR), amely értesíti a webalkalmazást, amikor új tárolórendszerképet küld le. A webhook lehetővé teszi, hogy az alkalmazás automatikusan lekérje és futtassa a legújabb verziót.

Az Azure Container Registryben (ACR) konfigurált webhook POST-kérést küld a webalkalmazás SCM-végpontjának (SERVICE_URI), amikor egy új rendszerképet küld az msdocspythoncontainerwebapp-adattárba. Ez a művelet elindítja a webalkalmazást a frissített rendszerkép lekéréséhez és üzembe helyezéséhez, és befejezi a folyamatos üzembe helyezési folyamatot az ACR és az Azure App Service között.

Jegyzet

A webhook URI-jának a következő formátumot kell követnie:
https://<app-name>.scm.azurewebsites.net/api/registry/webhook

Ennek ponttal kell végződnie/api/registry/webhook. Ha URI-hibát kap, ellenőrizze, hogy az elérési út helyes-e.

  1. Ebben a lépésben az az acr webhook create paranccsal regisztrálja a webhookot, és konfigurálja, hogy az push eseményekre legyen aktiválva.

    #!/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
    
    

Tallózás a webhelyen

Annak ellenőrzéséhez, hogy a webalkalmazás fut-e, nyissa meg a https://<website-name>.azurewebsites.net-t, és cserélje le a <website-name> helyére az App Service nevét. Nézd meg az étteremértékelő mintapéldány alkalmazást. Az első betöltés néhány percet is igénybe vehet.

A webhely megjelenése után próbáljon meg hozzáadni egy éttermet, és küldjön be egy felülvizsgálatot annak ellenőrzéséhez, hogy az alkalmazás megfelelően működik-e.

Jegyzet

A az webapp browse parancs nem támogatott a Cloud Shellben. Ha Cloud Shellt használ, nyisson meg manuálisan egy böngészőt, és keresse meg a webhely URL-címét.

Ha helyileg használja az Azure CLI-t, az az webapp tallózási parancsával megnyithatja a webhelyet az alapértelmezett böngészőben:

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

Jegyzet

A az webapp browse parancs nem támogatott a Cloud Shellben. Nyisson meg egy böngészőablakot, és keresse meg helyette a webhely URL-címét.

Hibaelhárítás az üzembe helyezés során

Ha nem látja a mintaalkalmazást, próbálkozzon az alábbi lépésekkel.

  • A tároló üzembe helyezésével és az App Service szolgáltatással mindig ellenőrizze a Deployment Center / Naplók oldalát az Azure Portalon. Kérjük, ellenőrizze, hogy a konténer le lett-e húzva, és fut-e. A konténer kezdeti lekérése és futtatása eltarthat néhány pillanatig.
  • Próbálja meg újraindítani az App Service-t, és ellenőrizze, hogy ez megoldja-e a problémát.
  • Programozási hibák esetén ezek a hibák megjelennek az alkalmazásnaplókban. Az Azure Portal oldalán az App Service-hez válassza a "Problémák diagnosztizálása és megoldása", majd az "Alkalmazásnaplók"lehetőséget.
  • A mintaalkalmazás a MongoDB-hez készült Azure Cosmos DB-hez való kapcsolatra támaszkodik. Ellenőrizze, hogy az App Service rendelkezik-e a megfelelő kapcsolati adatokkal rendelkező alkalmazásbeállításokkal.
  • Győződjön meg arról, hogy a felügyelt identitás engedélyezve van az App Service-ben, és az üzembe helyezési központban van használatban. Az App Service Azure Portal lapján nyissa meg az App Service Deployment Center erőforrást, és ellenőrizze, hogy a Hitelesítésfelügyelt identitásravan-e beállítva.
  • Ellenőrizze, hogy a webhook definiálva van-e az Azure Container Registryben. A webhook lehetővé teszi, hogy az App Service lekérje a tárolórendszerképet. Különösen ellenőrizze, hogy a szolgáltatás URI-ja "/api/registry/webhook" végződésű-e. Ha nem, adja hozzá.
  • Különböző Azure Container Registry-termékváltozatok különböző funkciókkal rendelkeznek, beleértve a webhookok számát. Ha újrahasznál egy meglévő beállításjegyzéket, a következő üzenet jelenik meg: "A beállításjegyzék alapszintű termékváltozatához tartozó erőforrástípus-webhookok kvótája túllépte a kvótát. További információ a különböző termékváltozatkvótákról és a frissítési folyamatról: https://aka.ms/acr/tiers". Ha megjelenik ez az üzenet, használjon új beállításjegyzéket, vagy csökkentse a használatban lévő beállításjegyzék-webhookok számát.

Következő lépés