Delen via


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

Dit artikel maakt deel uit van een zelfstudie over het in een container zetten en implementeren van een Python-web-app in Azure App Service. Met App Service kunt u in containers geplaatste web-apps uitvoeren en implementeren via mogelijkheden voor continue integratie/continue implementatie (CI/CD) met Docker Hub, Azure Container Registry en Visual Studio Team Services.

In dit deel van de zelfstudie leert u hoe u de in containers geplaatste Python-web-app implementeert in App Service met behulp van de App Service Web App for Containers. Met Web App for Containers kunt u zich richten op het opstellen van uw containers zonder dat u zich zorgen hoeft te maken over het beheren en onderhouden van een onderliggende containerorchestrator.

Nadat u de stappen in dit artikel hebt uitgevoerd, eindigt u met een App Service-website met een Docker-container-image. De App Service haalt de initiële afbeelding op uit Azure Container Registry met behulp van een beheerde identiteit voor authenticatie.

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.

De web-app maken

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

  1. Haal de resource-ID op van de groep die Azure Container Registry bevat met de opdracht az group show.

    # RESOURCE_GROUP_NAME='msdocs-web-app-rg'
    
    RESOURCE_ID=$(az group show \
      --resource-group $RESOURCE_GROUP_NAME \
      --query id \
      --output tsv)
    echo $RESOURCE_ID
    

    RESOURCE_GROUP_NAME moet nog steeds in uw omgeving worden ingesteld op de naam van de resourcegroep die u in deel 3 hebt gebruikt. Bouw container in Azure van deze zelfstudie. Als dit niet het is, verwijder de opmerkingen bij de eerste regel en stel deze in op de naam die u hebt gebruikt.

  2. Maak een App Service-plan met de opdracht az appservice plan create.

    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
    
  3. Maak een webapp met de opdracht az webapp create.

    Met de volgende opdracht wordt ook de door het systeem toegewezen beheerde identiteit voor de web-app ingeschakeld en wordt deze de AcrPull rol toegewezen aan de opgegeven resource, in dit geval de resourcegroep die het Azure Container Registry bevat. Hiermee verleent u de door het systeem beheerde identiteit trekbevoegdheden voor de Azure Container Registry in de resourcegroep.

    APP_SERVICE_NAME='<website-name>'
    # REGISTRY_NAME='<your Azure Container Registry name>'
    CONTAINER_NAME=$REGISTRY_NAME'.azurecr.io/msdocspythoncontainerwebapp:latest'
    
    az webapp create \
      --resource-group $RESOURCE_GROUP_NAME \
      --plan $APP_SERVICE_PLAN_NAME \
      --name $APP_SERVICE_NAME \
      --assign-identity '[system]' \
      --scope $RESOURCE_ID \
      --role acrpull \
      --deployment-container-image-name $CONTAINER_NAME 
    

    Waar:

    • APP_SERVICE_NAME moet globaal uniek zijn omdat deze de naam van de website wordt in de URL https://<website-name>.azurewebsites.net.
    • CONTAINER_NAME heeft de vorm van "yourregistryname.azurecr.io/repo_name:tag".
    • REGISTRY_NAME moet nog steeds in uw omgeving worden ingesteld op de registernaam die u in deel 3 hebt gebruikt. Bouw container in Azure van deze zelfstudie. Als dat niet het geval is, verwijder dan het commentaar bij de regel waar het in het codefragment is ingesteld en stel het in op de naam die u hebt gebruikt.

    Notitie

    Er wordt mogelijk een foutbericht weergegeven dat vergelijkbaar is met de volgende bij het uitvoeren van de opdracht:

    No credential was provided to access Azure Container Registry. Trying to look up...
    Retrieving credentials failed with an exception:'No resource or more than one were found with name ...'
    

    Deze fout treedt op omdat de web-app standaard de beheerdersreferenties van Azure Container Registry gebruikt om te verifiëren met het register en de beheerdersreferenties niet zijn ingeschakeld in het register. U kunt deze fout veilig negeren omdat u de web-app instelt op het gebruik van de door het systeem toegewezen beheerde identiteit voor verificatie in de volgende opdracht.

Beheerde identiteit en webhook configureren

  1. Configureer de web-app voor het gebruik van beheerde identiteiten om uit Azure Container Registry te halen met de opdracht az webapp config set.

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --generic-configurations '{"acrUseManagedIdentityCreds": true}'
    

    Omdat u de door het systeem toegewezen beheerde identiteit hebt ingeschakeld bij het maken van de web-app, is dit de beheerde identiteit die wordt gebruikt om uit Azure Container Registry te halen.

  2. Haal de referentie voor het toepassingsbereik op met de opdracht az webapp deployment list-publishing-credentials.

    CREDENTIAL=$(az webapp deployment list-publishing-credentials \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --query publishingPassword \
      --output tsv)
    echo $CREDENTIAL 
    
  3. Gebruik de toepassings-bereikreferentie om een webhook te maken met de opdracht az acr webhook create.

    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 
    

    Met deze opdracht wordt standaard de webhook gemaakt in dezelfde resourcegroep en locatie als het opgegeven Azure Container Registry. Desgewenst kunt u de parameters --resource-group en --location gebruiken om dit gedrag te overschrijven.

Verbinding met MongoDB configureren

In deze stap geeft u omgevingsvariabelen op die nodig zijn om verbinding te maken met MongoDB.

Als u een Azure Cosmos DB voor MongoDB moet maken, raden we u aan de stappen te volgen om Cosmos DB for MangoDB in te stellen gedeeltelijk 2. Bouw en test de container lokaal van deze zelfstudie. Wanneer u klaar bent, hebt u een Azure Cosmos DB voor MongoDB-verbindingsreeks in de vorm mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>.

U hebt de MongoDB-verbindingsreeks nodig om de onderstaande stappen uit te voeren.

Als je omgevingsvariabelen wilt instellen in App Service, kun je app-instellingen maken met de volgende az webapp config appsettings set opdracht.

MONGO_CONNECTION_STRING='your Mongo DB connection string in single quotes'
MONGO_DB_NAME=restaurants_reviews
MONGO_COLLECTION_NAME=restaurants_reviews

az webapp config appsettings set \
   --resource-group $RESOURCE_GROUP_NAME \
   --name $APP_SERVICE_NAME \
   --settings CONNECTION_STRING=$MONGO_CONNECTION_STRING \
              DB_NAME=$MONGO_DB_NAME  \
              COLLECTION_NAME=$MONGO_COLLECTION_NAME 
  • CONNECTION_STRING: een verbindingsreeks die begint met 'mongodb://'.
  • DB_NAME: Gebruik 'restaurants_reviews'.
  • COLLECTION_NAME: Gebruik 'restaurants_reviews'.

Door de site bladeren

Als u wilt controleren of de site wordt uitgevoerd, gaat u naar https://<website-name>.azurewebsites.net; waarbij de naam van de website uw app-servicenaam is. Als het gelukt is, zou u de voorbeeld-app voor restaurantrecensies moeten zien. Het kan even duren voordat de site de eerste keer wordt gestart. Wanneer de site wordt weergegeven, voegt u een restaurant en een beoordeling voor dat restaurant toe om te bevestigen dat de voorbeeld-app werkt.

Als u de Azure CLI lokaal uitvoert, kunt u de opdracht az webapp browse opdracht gebruiken om naar de website te bladeren. Als u Cloud Shell gebruikt, opent u een browservenster en navigeert u naar de URL van de website.

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 Deployment Center / logboeken 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 Problemen vaststellen en oplossen/toepassingslogboeken.
  • De voorbeeld-app is afhankelijk van een verbinding met 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 Resource van het App Service Deployment Center en controleer of verificatie- is ingesteld op beheerde identiteit.
  • 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'.
  • Verschillende Azure Container Registry-SKU's verschillende functies hebben, 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, gebruik een nieuw register of verminder het aantal registerwebhooks dat in gebruik is.

Volgende stap