Dela via


Distribuera en containerbaserad Python-app till App Service

I den här delen av självstudieserien får du lära dig hur du distribuerar en containerbaserad Python-webbapp till Azure App Service Web App for Containers. Med den här fullständigt hanterade tjänsten kan du köra containerbaserade appar utan att behöva underhålla din egen containerorkestrerare.

App Service förenklar distributionen via CI/CD-pipelines (kontinuerlig integrering/kontinuerlig distribution) som fungerar med Docker Hub, Azure Container Registry, Azure Key Vault och andra DevOps-verktyg. Den här självstudien är del 4 i en självstudieserie i fem delar.

I slutet av den här artikeln har du en säker, produktionsklar App Service-webbapp som körs från en Docker-containeravbildning. Appen använder en systemtilldelad hanterad identitet för att hämta avbildningen från Azure Container Registry och hämta hemligheter från Azure Key Vault.

Det här tjänstdiagrammet visar de komponenter som beskrivs i den här artikeln.

En skärmbild av de tjänster som använder i självstudien – Containeriserad Python-app i Azure med distributionssökvägen markerad.

Azure CLI-kommandon kan köras i Azure Cloud Shell eller på en lokal dator med Azure CLI installerat.

Viktig

Vi rekommenderar att du använder Azure Cloud Shell för alla CLI-baserade steg i den här självstudien eftersom det:

  • Levereras förautentiserad med ditt Azure-konto, vilket undviker inloggningsproblem
  • Innehåller alla nödvändiga Azure CLI-tillägg direkt
  • Säkerställer konsekvent beteende oavsett ditt lokala operativsystem eller din miljö
  • Kräver ingen lokal installation, perfekt för användare utan administratörsbehörighet
  • Ger direkt åtkomst till Azure-tjänster från portalen – ingen lokal Docker- eller nätverkskonfiguration krävs
  • Undviker problem med lokal brandvägg eller nätverkskonfiguration

Skapa Key Vault med RBAC-auktorisering

Azure Key Vault är en säker tjänst för lagring av hemligheter, API-nycklar, anslutningssträngar och certifikat. I det här skriptet lagras MongoDB-anslutningssträngen och webbappens SECRET_KEY.

Key Vault är konfigurerat för att använda rollbaserad åtkomstkontroll (RBAC) för att hantera åtkomst via Azure-roller i stället för traditionella åtkomstprinciper. Webbappen använder sin systemtilldelade hanterade identitet för att hämta hemligheter på ett säkert sätt under körning.

Anmärkning

Om du skapar Key Vault tidigt ser du till att roller kan tilldelas innan du försöker komma åt hemligheter. Det hjälper också till att undvika spridningsfördröjningar i rolltilldelningar. Eftersom Key Vault inte är beroende av App Service, förbättrar att etablera den tidigt tillförlitligheten och sekvenseringen.

  1. I det här steget använder du kommandot az keyvault create för att skapa ett Azure Key Vault med RBAC aktiverat.

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

Skapa apptjänstplanen och webbappen

App Service-planen definierar beräkningsresurser, prisnivå och region för din webbapp. Webbappen kör ditt containerbaserade program och etableras med en systemtilldelad hanterad identitet som används för att autentisera på ett säkert sätt till Azure Container Registry (ACR) och Azure Key Vault.

I det här steget utför du följande uppgifter:

  • Skapa en App Service-plan
  • Skapa webbappen med dess hanterade identitet
  • Konfigurera webbappen så att den distribueras med en specifik containeravbildning
  • Förbereda för kontinuerlig distribution via ACR

Anmärkning

Webbappen måste skapas innan du tilldelar åtkomst till ACR eller Key Vault eftersom den hanterade identiteten endast skapas vid distributionstillfället. Om du tilldelar containeravbildningen när du skapar den kan appen också startas korrekt med den avsedda konfigurationen.

  1. I det här steget använder du kommandot az appservice plan create för att etablera beräkningsmiljön för din app.

    #!/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. I det här steget använder du kommandot az webapp create för att skapa webbappen. Det här kommandot aktiverar även en systemtilldelad hanterad identitet och anger containeravbildningen som appen kör.

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

    Anmärkning

    När du kör det här kommandot kan följande fel visas:

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

    Det här felet beror på att webbappen försöker använda administratörsautentiseringsuppgifter för att komma åt ACR, vilka autentiseringsuppgifter som är inaktiverade som standard. Det är säkert att ignorera det här meddelandet: nästa steg konfigurerar webbappen så att den använder sin hanterade identitet för att autentisera med ACR.

Bevilja rollen som hemlighetsansvarig till inloggad användare

Om du vill lagra hemligheter i Azure Key Vault måste användaren som kör skriptet ha rollen Key Vault Secrets Officer . Med den här rollen kan du skapa och hantera hemligheter i valvet.

I det här steget tilldelar skriptet rollen till den inloggade användaren. Den här användaren kan sedan lagra programhemligheter på ett säkert sätt, till exempel MongoDB-anslutningssträngen och appens SECRET_KEY.

Den här rolltilldelningen är den första av två Key Vault-relaterade rolltilldelningar. Senare beviljas webbappens systemtilldelade hanterade identitet åtkomst för att hämta hemligheter från valvet.

Genom att använda Azure RBAC säkerställs säker, granskningsbar åtkomst baserat på identitet, vilket eliminerar behovet av hårdkodade autentiseringsuppgifter.

Anmärkning

Användaren måste tilldelas rollen Key Vault Secrets Officerinnan han eller hon försöker lagra hemligheter i nyckelvalvet. Den här tilldelningen görs med kommandot az role assignment create som är begränsat till Key Vault.

  1. I det här steget använder du kommandot az role assignment create för att tilldela rollen i Key Vault-omfånget.

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

Bevilja webbåtkomst till ACR med hjälp av hanterad identitet

Om du vill hämta avbildningar från Azure Container Registry (ACR) på ett säkert sätt måste webbappen konfigureras för att använda sin systemtilldelade hanterade identitet. Med hanterad identitet undviker du behovet av administratörsautentiseringsuppgifter och stöder säker distribution utan autentiseringsuppgifter.

Den här processen omfattar två viktiga åtgärder:

  • Göra det möjligt för webbappen att använda sin hanterade identitet vid åtkomst till ACR
  • Tilldela AcrPull-rollen till den identiteten på mål-ACR
  1. I det här steget hämtar du huvud-ID :t (unikt objekt-ID) för webbappens hanterade identitet med kommandot az webapp identity show . Sedan aktiverar du användningen av den hanterade identiteten för ACR-autentisering genom att ställa in acrUseManagedIdentityCreds-egenskapen till true med kommandot az webapp config set. Sedan tilldelar du AcrPull-rollen till webbappens hanterade identitet med kommandot az role assignment create . Den här rollen ger webbappen behörighet att hämta avbildningar från registret.

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

Ge nyckelvalvet åtkomst till webbappens hanterade identitet

Webbappen behöver behörighet att komma åt hemligheter som MongoDB-anslutningssträngen SECRET_KEYoch . Om du vill bevilja dessa behörigheter måste du tilldela rollen Key Vault Secrets User till webbappens systemtilldelade hanterade identitet.

  1. I det här steget använder du den unika identifieraren (huvud-ID) för webbappens systemtilldelade hanterade identitet för att ge webbappen åtkomst till Key Vault med key vault-hemligheternas användarroll med kommandot 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"
    

Lagra hemligheter i Key Vault

För att undvika hårdkodning av hemligheter i ditt program lagrar det här steget MongoDB-anslutningssträngen och webbappens hemliga nyckel i Azure Key Vault. Dessa hemligheter kan sedan nås på ett säkert sätt av webbappen vid körning via dess hanterade identitet, utan att behöva lagra autentiseringsuppgifter i kod eller konfiguration.

Anmärkning

Även om den här självstudien endast lagrar anslutningssträngen och den hemliga nyckeln i nyckelvalvet kan du även lagra andra programinställningar, till exempel MongoDB-databasnamnet eller samlingsnamnet i Key Vault.

  1. I det här steget använder du kommandot az cosmosdb keys list för att hämta MongoDB-anslutningssträngen. Sedan använder du kommandot az keyvault secret set för att lagra både anslutningssträngen och en slumpmässigt genererad hemlig nyckel i 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"
    

Konfigurera webbappen så att den använder Kay Vault-hemligheter

För att komma åt hemligheter på ett säkert sätt vid körning måste webbappen konfigureras för att referera till hemligheterna som lagras i Azure Key Vault. Det här steget görs med key vault-referenser som matar in de hemliga värdena i appens miljö via dess systemtilldelade hanterade identitet.

Den här metoden undviker hårdkodning av hemligheter och gör att appen på ett säkert sätt kan hämta känsliga värden som MongoDB-anslutningssträngen och den hemliga nyckeln under körningen.

  1. I det här steget använder du kommandot az webapp config appsettings set för att lägga till programinställningar som refererar till Key Vault-hemligheterna. Detta anger i synnerhet appinställningarna för MongoConnectionString och MongoSecretKey så att de refererar till de motsvarande hemligheter som lagras i 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"
    

Aktivera kontinuerlig distribution från ACR

Genom att aktivera kontinuerlig distribution kan webbappen automatiskt hämta och köra den senaste containeravbildningen när en skickas till Azure Container Registry (ACR). Detta minskar de manuella distributionsstegen och säkerställer att din app håller sig uppdaterad.

Anmärkning

I nästa steg registrerar du en webhook i ACR för att meddela webbappen när en ny bild pushas.

  1. I det här steget använder du kommandot az webapp deployment container config för att aktivera kontinuerlig distribution från ACR till webbappen.

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

Registrera en ACR Webhook för kontinuerlig distribution

Om du vill automatisera distributioner registrerar du en webhook i Azure Container Registry (ACR) som meddelar webbappen när en ny containeravbildning skickas. Med webhooken kan appen automatiskt hämta och köra den senaste versionen.

Webhooken som konfigurerats i Azure Container Registry (ACR) skickar en POST-begäran till webbappens SCM-slutpunkt (SERVICE_URI) när en ny avbildning skickas till lagringsplatsen msdocspythoncontainerwebapp. Den här åtgärden utlöser webbappen för att hämta och distribuera den uppdaterade avbildningen och slutföra pipelinen för kontinuerlig distribution mellan ACR och Azure App Service.

Anmärkning

Webhook-URI:n måste följa det här formatet:
https://<app-name>.scm.azurewebsites.net/api/registry/webhook

Det måste sluta med /api/registry/webhook. Om du får ett URI-fel kontrollerar du att sökvägen är korrekt.

  1. I det här steget använder du kommandot az acr webhook create för att registrera webhooken och konfigurera den för att utlösa push händelser.

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

Bläddra på webbplatsen

Kontrollera att webbappen körs genom att öppna https://<website-name>.azurewebsites.netoch ersätta <website-name> med namnet på din App Service. Du bör se exempelappen för restauranggranskning. Det kan ta en stund att läsa in första gången.

När webbplatsen visas kan du prova att lägga till en restaurang och skicka en granskning för att bekräfta att appen fungerar korrekt.

Anmärkning

Kommandot az webapp browse stöds inte i Cloud Shell. Om du använder Cloud Shell öppnar du en webbläsare manuellt och navigerar till webbplatsens URL.

Om du använder Azure CLI lokalt kan du använda kommandot az webapp browse för att öppna webbplatsen i standardwebbläsaren:

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

Anmärkning

Kommandot az webapp browse stöds inte i Cloud Shell. Öppna ett webbläsarfönster och navigera till webbplatsens URL i stället.

Felsök driftsättning

Om du inte ser exempelappen kan du prova följande steg.

  • Med containerutplacering och App Service ska du alltid kontrollera sidan Deployment Center / Loggar i Azure-portalen. Bekräfta att containern har hämtats och körs. Den första hämtningen och körningen av containern kan ta en stund.
  • Försök att starta om App Service och se om det löser problemet.
  • Om det finns programmeringsfel visas dessa fel i programloggarna. På sidan Azure-portalen för App Service väljer du Diagnostisera och lösa problem/programloggar.
  • Exempelappen förlitar sig på en anslutning till Azure Cosmos DB för MongoDB. Bekräfta att App Service har programinställningar med rätt anslutningsinformation.
  • Bekräfta att den hanterade identiteten är aktiverad för appservicen och används i distributionscentret. På Azure-portalen går du till App Service-resursen Deployment Center och bekräftar att Autentisering är inställt på Hanterad identitet.
  • Kontrollera att webhooken har definierats i Azure Container Registry. Med webhooken kan App Service hämta containeravbildningen. Kontrollera särskilt att tjänst-URI slutar med "/api/registry/webhook". Om inte, lägg till den.
  • Olika Azure Container Registry-sku:er har olika funktioner, inklusive antalet webhooks. Om du återanvänder ett befintligt register kan du se meddelandet "Kvoten har överskridits för resurstypen webhooks för registret SKU Basic." Läs mer om olika SKU-kvoter och uppgraderingsprocess: https://aka.ms/acr/tiers". Om du ser det här meddelandet, använd ett nytt register eller minska antalet register-webhooks som används.

Nästa steg