Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.
Du kan köra Azure CLI kommandon i Azure Cloud Shell eller på en lokal dator med Azure CLI installerat.
Viktig
Använd Azure Cloud Shell för alla CLI-baserade steg i den här självstudien eftersom det:
- Levereras förautentiserad med ditt Azure-konto, så att du inte stöter på autentiseringsproblem
- Innehåller alla nödvändiga Azure CLI tillägg
- 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.
Konfigurera Key Vault att använda role-baserad å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
Skapa Key Vault tidigt för att säkerställa att du kan tilldela roller innan du försöker komma åt hemligheter. Den här metoden hjälper också till att undvika spridningsfördröjningar i rolltilldelningar. Eftersom Key Vault inte är beroende av App Service, förbättras tillförlitligheten och ordningsföljden genom att etablera det tidigt.
Använd kommandot az keyvault create för att skapa en 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 din containerbaserade applikation och förses med en systemtilldelad hanterad identitet som den använder för att på ett säkert sätt autentisera sig mot 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 hjälp av en specifik containeravbildning
- Förbereda för kontinuerlig distribution via ACR
Anmärkning
Du måste skapa webbappen 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.
Använd 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-linuxAnvänd 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, men administratörsautentiseringsuppgifterna är inaktiverade som standard. Du kan ignorera det här meddelandet. Nästa steg konfigurerar webbappen att använda sin hanterade identitet för att autentisera med ACR.
Bevilja Key Vault secrets officer-rollen till autentiserad 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 . Den här rollen ger behörighet att skapa och hantera hemligheter i valvet.
I det här steget tilldelar skriptet rollen till den autentiserade 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äller du säker, granskningsbar åtkomst baserat på identitet, så att du inte behöver använda hårdkodade autentiseringsuppgifter.
Anmärkning
Tilldela rollen Key Vault Secrets Officer till användaren innan användaren försöker lagra några hemligheter i nyckelvalvet. Använd kommandot az role assignment create med omfång för Key Vault för att skapa den här rolltilldelningen.
Använd kommandot az role assignment create för att tilldela rollen i Key Vault omfång.
#!/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 konfigurerar du webbappen så att den använder sin systemtilldelade hanterade identitet. Genom att använda hanterad identitet behöver du inte administratörsautentiseringsuppgifter och kan stödja 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
I det här steget hämtar du huvud-ID :t (unikt objekt-ID) för webbappens hanterade identitet med hjälp av kommandot az webapp identity show . Aktivera sedan användningen av den hanterade identiteten för ACR-autentisering genom att ange
acrUseManagedIdentityCredsegenskapen tilltruemed hjälp av az webapp config set. Tilldela sedan AcrPull-rollen till webbappens hanterade identitet med hjälp av 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 tilldelar du rollen Key Vault Secrets User till webbappens systemtilldelade hanterade identitet.
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 Secrets User roll med hjälp av 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
Om du vill undvika hårdkodning av hemligheter i ditt program lagrar du MongoDB reťazec pripojenia och webbappens sekretnyckel i Azure Key Vault. Webbappen kan på ett säkert sätt komma åt dessa hemligheter vid körning via dess hanterade identitet, så du behöver inte 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.
Använd kommandot az cosmosdb keys list för att hämta MongoDB-reťazec pripojenia. Använd sedan kommandot az keyvault secret set för att lagra både reťazec pripojenia 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 Key Vault hemligheter
Om du vill komma åt hemligheter på ett säkert sätt vid körning konfigurerar du webbappen så att den refererar till hemligheterna som lagras i Azure Key Vault. Använd Key Vault referenser för att mata in hemliga värden 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.
Använd kommandot az webapp config appsettings set för att lägga till programinställningar som refererar till Key Vault hemligheter. Mer specifikt anger du appinställningarna
MongoConnectionStringochMongoSecretKeyför att referera till 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
När du aktiverar kontinuerlig distribution hämtar och kör webbappen automatiskt den senaste containeravbildningen när du push-överför en till Azure Container Registry (ACR). Den här funktionen minskar stegen för manuell distribution och hjälper till att se till 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 avbildning skickas.
Använd 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 hjälp av webhooken hämtar och kör appen automatiskt den senaste versionen.
Webhooken som du konfigurerar 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.
Använd kommandot az acr webhook create för att registrera webhooken och konfigurera den för att utlösa
pushhä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 går till webbplatsens URL.
Om du använder Azure CLI lokalt använder du 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 gå till webbplatsens URL i stället.
Felsök driftsättning
Om du inte ser exempelappen kan du prova följande steg.
- För containerdistribution och App Service kontrollerar du alltid sidan Deployment Center / Logs i Azure portalen. Kontrollera att containern har hämtats och är igång. 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 med 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.