Delen via


Een in een container geplaatste Python-app implementeren in App Service

In dit deel van de reeks zelfstudies leert u hoe u een in een container geplaatste Python-webtoepassing implementeert in Azure App Service Web App for Containers. Met deze volledig beheerde service kunt u container-apps uitvoeren zonder dat u uw eigen containerorchestrator hoeft te onderhouden.

App Service vereenvoudigt de implementatie via CI/CD-pijplijnen (continue integratie/continue implementatie) die werken met Docker Hub, Azure Container Registry, Azure Key Vault en andere DevOps-hulpprogramma's. Deze zelfstudie is deel 4 van een 5-delige reeks zelfstudies.

Aan het einde van dit artikel heb je een beveiligde, productieklare App Service-web-app die wordt uitgevoerd vanuit een Docker-containerafbeelding. De app maakt gebruik van een door het systeem toegewezen beheerde identiteit om de installatiekopie op te halen uit Azure Container Registry en geheimen op te halen uit Azure Key Vault.

Dit servicediagram markeert de onderdelen die in dit artikel worden behandeld.

Een schermopname van de services die worden gebruikt in de zelfstudie: In containers geplaatste Python-app in Azure met het implementatiepad gemarkeerd.

Azure CLI-opdrachten kunnen worden uitgevoerd in Azure Cloud Shell of op een lokale computer waarop de Azure CLI is geïnstalleerd.

Belangrijk

We raden u aan Om Azure Cloud Shell te gebruiken voor alle CLI-stappen in deze zelfstudie, omdat dit het volgende doet:

  • Wordt vooraf geverifieerd met uw Azure-account, waardoor aanmeldingsproblemen worden voorkomen
  • Bevat standaard alle vereiste Azure CLI-extensies.
  • Zorgt voor consistent gedrag, ongeacht uw lokale besturingssysteem of omgeving
  • Vereist geen lokale installatie, ideaal voor gebruikers zonder beheerdersrechten
  • Biedt directe toegang tot Azure-services vanuit de portal. Er is geen lokale Docker- of netwerkinstallatie vereist
  • Vermijdt problemen met de lokale firewall of netwerkconfiguratie

Key Vault maken met RBAC-autorisatie

Azure Key Vault is een beveiligde service voor het opslaan van geheimen, API-sleutels, verbindingsreeksen en certificaten. In dit script worden de MongoDB-verbindingsreeks en de web-app opgeslagen SECRET_KEY.

Key Vault is geconfigureerd voor het gebruik van op rollen gebaseerd toegangsbeheer (RBAC) voor het beheren van toegang via Azure-rollen in plaats van traditioneel toegangsbeleid. De web-app gebruikt de door het systeem toegewezen beheerde identiteit om geheimen veilig op te halen tijdens runtime.

Notitie

Als u key vault vroeg maakt, zorgt u ervoor dat rollen kunnen worden toegewezen voordat u toegang probeert te krijgen tot geheimen. Het helpt ook om vertragingen bij roltoewijzingen te voorkomen. Omdat Key Vault niet afhankelijk is van de App Service, verbetert het inrichten ervan de betrouwbaarheid en sequentiëring vroeg.

  1. In deze stap gebruikt u de opdracht az keyvault create om een Azure Key Vault te maken waarvoor RBAC is ingeschakeld.

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

Het App Service-plan en de web-app maken

Het App Service-plan definieert de rekenresources, prijscategorie en regio voor uw web-app. De web-app voert uw containertoepassing uit en wordt ingericht met een door het systeem toegewezen beheerde identiteit die wordt gebruikt om veilig te verifiëren bij Azure Container Registry (ACR) en Azure Key Vault.

In deze stap voert u de volgende taken uit:

  • Een App Service-plan maken
  • De web-app maken met de beheerde identiteit
  • De webapp configureren om te implementeren met een specifieke containerimage.
  • Voorbereiden op continue implementatie via ACR

Notitie

De web-app moet worden gemaakt voordat u toegang tot ACR of Key Vault toewijst, omdat de beheerde identiteit alleen tijdens de implementatie wordt gemaakt. Door bij het aanmaken de container-image toe te wijzen, zorgt u ervoor dat de app correct start met de bedoelde configuratie.

  1. In deze stap gebruikt u de opdracht az appservice plan create om de rekenomgeving voor uw app in te richten.

    #!/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. In deze stap gebruikt u de opdracht az webapp create om de web-app te maken. Met deze opdracht wordt ook een door het systeem toegewezen beheerde identiteit ingeschakeld en wordt de containerafbeelding ingesteld waarmee de app wordt uitgevoerd.

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

    Notitie

    Wanneer u deze opdracht uitvoert, ziet u mogelijk de volgende fout:

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

    Deze fout treedt op omdat de web-app probeert beheerdersreferenties te gebruiken voor toegang tot ACR. Deze referenties zijn standaard uitgeschakeld. Het is veilig om dit bericht te negeren: met de volgende stap configureert u de web-app om de beheerde identiteit te gebruiken voor verificatie met ACR.

De rol Secrets Officer verlenen aan aangemelde gebruiker

Als u geheimen wilt opslaan in Azure Key Vault, moet de gebruiker die het script uitvoert de rol Key Vault Secrets Officer hebben. Met deze rol kunt u geheimen in de kluis aanmaken en beheren.

In deze stap wijst het script die rol toe aan de momenteel aangemelde gebruiker. Deze gebruiker kan vervolgens veilig toepassingsgeheimen opslaan, zoals de MongoDB-verbindingsreeks en de app SECRET_KEY.

Deze roltoewijzing is de eerste van twee sleutelkluisgerelateerde roltoewijzingen. Later krijgt de door het systeem toegewezen beheerde identiteit van de web-app toegang tot het ophalen van geheimen uit de kluis.

Het gebruik van Azure RBAC zorgt voor veilige, controleerbare toegang op basis van identiteit, waardoor de noodzaak van in code vastgelegde referenties niet meer nodig is.

Notitie

Aan de gebruiker moet de rol Key Vault Secrets Officer worden toegewezen voordat u probeert geheimen op te slaan in de sleutelkluis. Deze opdracht wordt uitgevoerd met behulp van de az role assignment create opdracht die gericht is op de Key Vault.

  1. In deze stap gebruikt u de opdracht az role assignment create om de rol toe te wijzen aan het Key Vault-bereik.

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

Webtoegang verlenen aan ACR met behulp van beheerde identiteit

Om afbeeldingen veilig op te halen uit Azure Container Registry (ACR), moet de web-app geconfigureerd zijn om de door het systeem toegewezen beheerde identiteit te gebruiken. Het gebruik van beheerde identiteit voorkomt dat beheerdersreferenties nodig zijn en biedt ondersteuning voor veilige, referentievrije implementatie.

Dit proces omvat twee belangrijke acties:

  • De web-app inschakelen voor het gebruik van de beheerde identiteit bij het openen van ACR
  • De AcrPull-rol toewijzen aan die identiteit op de doel-ACR
  1. In deze stap haalt u de principal-id (unieke object-id) van de beheerde identiteit van de web-app op met behulp van de opdracht az webapp identity show . Vervolgens schakelt u het gebruik van de beheerde identiteit voor ACR-verificatie in door de acrUseManagedIdentityCreds eigenschap in te stellen op trueaz webapp config set. Vervolgens wijst u de AcrPull-rol toe aan de beheerde identiteit van de web-app met behulp van de opdracht az role assignment create . Deze rol verleent de webapp toestemming om afbeeldingen uit het register op te halen.

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

Key Vault toegang verlenen tot de beheerde identiteit van de web-app

De web-app heeft toestemming nodig voor toegang tot geheimen, zoals de MongoDB-verbindingsreeks en de SECRET_KEY. Als u deze machtigingen wilt verlenen, moet u de rol Key Vault Secrets User toewijzen aan de door het systeem toegewezen beheerde identiteit van de web-app.

  1. In deze stap gebruikt u de unieke id (principal-id) van de door het systeem toegewezen beheerde identiteit van de web-app om de web-app toegang te verlenen tot de Key Vault met de rol Key Vault Secrets User met behulp van de opdracht 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"
    

Geheimen opslaan in Key Vault

Om hardcoderingsgeheimen in uw toepassing te voorkomen, slaat deze stap de MongoDB-verbindingsreeks en de geheime sleutel van de web-app op in Azure Key Vault. Deze geheimen kunnen vervolgens tijdens runtime veilig worden geopend door de web-app via de beheerde identiteit, zonder dat u referenties hoeft op te slaan in code of configuratie.

Notitie

Hoewel in deze zelfstudie alleen de verbindingsreeks en geheime sleutel in de sleutelkluis worden opgeslagen, kunt u desgewenst ook andere toepassingsinstellingen opslaan, zoals de mongoDB-databasenaam of verzamelingsnaam in Key Vault.

  1. In deze stap gebruikt u de opdracht az cosmosdb keys list om de MongoDB-verbindingsreeks op te halen. Vervolgens gebruikt u de opdracht az keyvault secret set om zowel de verbindingsreeks als een willekeurig gegenereerde geheime sleutel in Key Vault op te slaan.

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

Web-app configureren voor het gebruik van Kay Vault-geheimen

Als u tijdens runtime veilig toegang wilt krijgen tot geheimen, moet de web-app worden geconfigureerd om te verwijzen naar de geheimen die zijn opgeslagen in Azure Key Vault. Deze stap wordt uitgevoerd met Key Vault-verwijzingen, die de geheime waarden in de omgeving van de app injecteren via de door het systeem toegewezen beheerde identiteit.

Deze methode voorkomt hardcoderingsgeheimen en stelt de app in staat om tijdens de uitvoering veilig gevoelige waarden op te halen, zoals de MongoDB-verbindingsreeks en geheime sleutel.

  1. In deze stap gebruikt u de opdracht az webapp config appsettings set om toepassingsinstellingen toe te voegen die verwijzen naar de Key Vault-geheimen. Hiermee worden de MongoConnectionString en MongoSecretKey app-instellingen ingesteld om te verwijzen naar de bijbehorende geheimen die zijn opgeslagen in 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"
    

Continue implementatie vanuit ACR inschakelen

Door continue implementatie in te schakelen, kan de web-app automatisch de meest recente containerinstallatiekopie ophalen en uitvoeren wanneer deze naar Azure Container Registry (ACR) wordt gepusht. Dit vermindert handmatige implementatiestappen en zorgt ervoor dat uw app up-to-date blijft.

Notitie

In de volgende stap registreert u een webhook in ACR om de web-app te informeren wanneer een nieuwe afbeelding wordt gepusht.

  1. In deze stap gebruikt u de opdracht az webapp deployment container config om continue implementatie van ACR naar de web-app in te schakelen.

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

Een ACR-webhook registreren voor continue implementatie

Om implementaties te automatiseren, registreer een webhook in Azure Container Registry (ACR) die de web-app op de hoogte stelt wanneer een nieuwe containerimage wordt gepusht. Met de webhook kan de app automatisch de nieuwste versie ophalen en uitvoeren.

De webhook die is geconfigureerd in Azure Container Registry (ACR) verzendt een POST-aanvraag naar het SCM-eindpunt van de web-app (SERVICE_URI) wanneer een nieuwe image wordt gepusht naar de repository msdocspythoncontainerwebapp. Met deze actie wordt de web-app geactiveerd om de bijgewerkte installatiekopie op te halen en te implementeren, waarbij de pijplijn voor continue implementatie tussen ACR en Azure App Service wordt voltooid.

Notitie

De webhook-URI moet deze indeling volgen:
https://<app-name>.scm.azurewebsites.net/api/registry/webhook

Het moet eindigen met /api/registry/webhook. Als u een URI-fout ontvangt, controleert u of het pad juist is.

  1. In deze stap gebruikt u de opdracht az acr webhook create om de webhook te registreren en deze te configureren voor het activeren van push gebeurtenissen.

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

Door de site bladeren

Als u wilt controleren of de web-app wordt uitgevoerd, opent u https://<website-name>.azurewebsites.net door <website-name> te vervangen door de naam van uw App Service. Bekijk de voorbeeld-app voor restaurantrecensies. Het kan even duren voordat de eerste keer wordt geladen.

Zodra de site wordt weergegeven, probeert u een restaurant toe te voegen en een beoordeling in te dienen om te bevestigen dat de app correct functioneert.

Notitie

De opdracht az webapp browse wordt niet ondersteund in Cloud Shell. Als u Cloud Shell gebruikt, opent u handmatig een browser en navigeert u naar de site-URL.

Als u de Azure CLI lokaal gebruikt, kunt u de opdracht az webapp browse gebruiken om de site te openen in uw standaardbrowser:

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

Notitie

De opdracht az webapp browse wordt niet ondersteund in Cloud Shell. Open een browservenster en navigeer in plaats daarvan naar de URL van de website.

Problemen met implementatie oplossen

Als u de voorbeeld-app niet ziet, voert u de volgende stappen uit.

  • Met containerimplementatie en App Service controleert u altijd de pagina Implementatiecentrumlogboeken / in Azure Portal. Controleer of de container is gestart en draait. Het kan even duren voordat de eerste pull en uitvoering van de container wordt uitgevoerd.
  • Start de App Service opnieuw op en kijk of dit uw probleem oplost.
  • Als er programmeerfouten zijn, worden deze fouten weergegeven in de toepassingslogboeken. Selecteer op de Azure-portalpagina voor de App Service de optie Diagnose en oplossen van problemen/Toepassingslogboeken.
  • De voorbeeld-app is afhankelijk van een verbinding met Azure Cosmos DB voor MongoDB. Controleer of de App Service toepassingsinstellingen heeft met de juiste verbindingsgegevens.
  • Controleer of beheerde identiteit is ingeschakeld voor de App Service en wordt gebruikt in het Deployment Center. Ga op de Azure-portalpagina voor de App Service naar de App Service Deployment Center-resource en controleer of verificatie is ingesteld op Managed Identity.
  • Controleer of de webhook is gedefinieerd in de Azure Container Registry. Met de webhook kan de App Service de containerafbeelding ophalen. Controleer met name of de service-URI eindigt op '/api/registry/webhook'. Zo niet, voeg het toe.
  • Verschillende Azure Container Registry-SKU's hebben verschillende functies, waaronder het aantal webhooks. Als u een bestaand register opnieuw gebruikt, kunt u het volgende bericht zien: 'Quotum overschreden voor resourcetype webhooks voor de registry-SKU Basic.' Meer informatie over verschillende SKU-quota en het upgradeproces: https://aka.ms/acr/tiers". Als u dit bericht ziet, gebruikt u een nieuw register of vermindert u het aantal registerwebhooks dat wordt gebruikt.

Volgende stap