Uw app rechtstreeks vanuit een ZIP-pakket uitvoeren in Azure-app Service

In Azure-app Service kunt u uw apps rechtstreeks vanuit een ZIP-pakketbestand voor implementatie uitvoeren. In dit artikel wordt beschreven hoe u deze functionaliteit inschakelt in uw app.

Alle andere implementatiemethoden in App Service hebben iets gemeen: uw bestanden worden geïmplementeerd op D:\home\site\wwwroot in uw app (of /home/site/wwwroot voor Linux-apps). Omdat dezelfde map tijdens runtime door uw app wordt gebruikt, kan de implementatie mislukken vanwege conflicten met bestandsvergrendeling en kan de app onvoorspelbaar gedrag vertonen omdat sommige bestanden nog niet zijn bijgewerkt.

Wanneer u daarentegen rechtstreeks vanuit een pakket uitvoert, worden de bestanden in het pakket niet gekopieerd naar de wwwroot-map . In plaats daarvan wordt het ZIP-pakket zelf rechtstreeks gekoppeld als de alleen-lezen wwwroot-map . Er zijn verschillende voordelen om rechtstreeks vanuit een pakket te worden uitgevoerd:

  • Elimineert bestandsvergrendelingsconflicten tussen implementatie en runtime.
  • Zorgt ervoor dat alleen volledig geïmplementeerde apps op elk gewenst moment worden uitgevoerd.
  • Kan worden geïmplementeerd in een productie-app (met opnieuw opstarten).
  • Verbetert de prestaties van Azure Resource Manager-implementaties.
  • Kan koude begintijden verminderen, met name voor JavaScript-functies met grote npm-pakketstructuren.

Notitie

Momenteel worden alleen ZIP-pakketbestanden ondersteund.

Een ZIP-projectpakket maken

Belangrijk

Neem bij het maken van het ZIP-pakket voor implementatie niet de hoofdmap op, maar alleen de bestanden en mappen erin. Als u een GitHub-opslagplaats als een ZIP-bestand downloadt, kunt u dat bestand niet implementeren in App Service. GitHub voegt extra geneste mappen toe op het hoogste niveau, die niet werken met App Service.

Navigeer in een lokaal terminalvenster naar de hoofdmap van uw app-project.

Deze map moet het invoerbestand bevatten voor uw web-app, zoals index.html, index.php en app.js. Het kan ook pakketbeheerbestanden bevatten, zoals project.json, composer.json, package.json, bower.json en requirements.txt.

Tenzij u wilt dat App Service implementatieautomatisering voor u uitvoert, voert u alle buildtaken (bijvoorbeeld npm, bower, gulp, composeren ) pipuit en controleert u of u alle bestanden hebt die u nodig hebt om de app uit te voeren. Deze stap is vereist als u uw pakket rechtstreeks wilt uitvoeren.

Maak een ZIP-archief van alle bestanden in uw project. Voor dotnet projecten is dit alles in de uitvoermap van de dotnet publish opdracht (met uitzondering van de uitvoermap zelf). Bijvoorbeeld de volgende opdracht in uw terminal om een ZIP-pakket te maken van de inhoud van de huidige map:

# Bash
zip -r <file-name>.zip .

# PowerShell
Compress-Archive -Path * -DestinationPath <file-name>.zip

Uitvoeren vanuit pakket inschakelen

De WEBSITE_RUN_FROM_PACKAGE app-instelling kan worden uitgevoerd vanuit een pakket. Voer de volgende opdracht uit met Azure CLI om deze in te stellen.

az webapp config appsettings set --resource-group <group-name> --name <app-name> --settings WEBSITE_RUN_FROM_PACKAGE="1"

WEBSITE_RUN_FROM_PACKAGE="1" hiermee kunt u uw app uitvoeren vanuit een pakket lokaal naar uw app. U kunt ook uitvoeren vanuit een extern pakket.

Het pakket uitvoeren

De eenvoudigste manier om een pakket uit te voeren in uw App Service is met de Azure CLI az webapp deployment source config-zip command. Voorbeeld:

az webapp deployment source config-zip --resource-group <group-name> --name <app-name> --src <filename>.zip

Omdat de WEBSITE_RUN_FROM_PACKAGE app-instelling is ingesteld, wordt met deze opdracht de pakketinhoud niet geëxtraheerd naar de map D:\home\site\wwwroot van uw app. In plaats daarvan wordt het ZIP-bestand geüpload naar D:\home\data\SitePackages en wordt er een packagename.txt gemaakt in dezelfde map, die de naam van het ZIP-pakket bevat dat tijdens runtime moet worden geladen. Als u uw ZIP-pakket op een andere manier uploadt (zoals FTP), moet u de map D:\home\data\SitePackages en het packagename.txt bestand handmatig maken.

Met de opdracht wordt de app ook opnieuw opgestart. Omdat WEBSITE_RUN_FROM_PACKAGE dit is ingesteld, koppelt App Service het geüploade pakket als de alleen-lezen wwwroot-map en voert de app rechtstreeks vanuit die gekoppelde map uit.

Uitvoeren vanaf externe URL in plaats daarvan

U kunt ook een pakket uitvoeren vanaf een externe URL, zoals Azure Blob Storage. U kunt Azure Storage Explorer gebruiken om pakketbestanden te uploaden naar uw Blob Storage-account. U moet een privéopslagcontainer gebruiken met een Shared Access Signature (SAS) of een beheerde identiteit gebruiken om de App Service-runtime in staat te stellen veilig toegang te krijgen tot het pakket.

Nadat u het bestand hebt geüpload naar Blob Storage en een SAS-URL voor het bestand hebt, stelt u de app-instelling WEBSITE_RUN_FROM_PACKAGE in op de URL. In het volgende voorbeeld wordt dit uitgevoerd met behulp van Azure CLI:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_RUN_FROM_PACKAGE="https://myblobstorage.blob.core.windows.net/content/SampleCoreMVCApp.zip?st=2018-02-13T09%3A48%3A00Z&se=2044-06-14T09%3A48%3A00Z&sp=rl&sv=2017-04-17&sr=b&sig=bNrVrEFzRHQB17GFJ7boEanetyJ9DGwBSV8OM3Mdh%2FM%3D"

Als u een bijgewerkt pakket met dezelfde naam naar Blob Storage publiceert, moet u de app opnieuw opstarten, zodat het bijgewerkte pakket in App Service wordt geladen.

Toegang krijgen tot een pakket in Azure Blob Storage met behulp van een beheerde identiteit

Azure Blob Storage kan worden geconfigureerd voor het autoriseren van aanvragen met Microsoft Entra-id. Dit betekent dat u in plaats van een SAS-sleutel met een vervaldatum te genereren, in plaats daarvan kunt u vertrouwen op de beheerde identiteit van de toepassing. Standaard wordt de door het systeem toegewezen identiteit van de app gebruikt. Als u een door de gebruiker toegewezen identiteit wilt opgeven, kunt u de WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID app-instelling instellen op de resource-id van die identiteit. De instelling kan ook 'SystemAssigned' accepteren als een waarde, hoewel dit hetzelfde is als het weglaten van de instelling.

Als u wilt dat het pakket wordt opgehaald met behulp van de identiteit:

  1. Zorg ervoor dat de blob is geconfigureerd voor privétoegang.

  2. Verdeel de identiteit de rol Opslagblobgegevenslezer met bereik over de pakket-blob. Zie Een Azure-rol toewijzen voor toegang tot blobgegevens voor meer informatie over het maken van de roltoewijzing.

  3. Stel de WEBSITE_RUN_FROM_PACKAGE toepassingsinstelling in op de blob-URL van het pakket. Dit is waarschijnlijk het formulier 'https://{storage-account-name}.blob.core.windows.net/{container-name}/{path-to-package}' of vergelijkbaar.

Webtaakbestanden implementeren wanneer deze worden uitgevoerd vanuit het pakket

Er zijn twee manieren om WebJob-bestanden te implementeren wanneer u het uitvoeren van een app vanuit het pakket inschakelt:

  • Implementeer in hetzelfde ZIP-pakket als uw app: neem ze op zoals u normaal zou doen <project-root>\app_data\jobs\... (wat overeenkomt met het implementatiepad \site\wwwroot\app_data\jobs\... zoals opgegeven in de snelstart voor WebJobs).
  • Implementeer afzonderlijk van het ZIP-pakket van uw app: omdat het gebruikelijke implementatiepad \site\wwwroot\app_data\jobs\... nu alleen-lezen is, kunt u daar geen webtaakbestanden implementeren. In plaats daarvan implementeert u WebJob-bestanden in \site\jobs\..., die niet alleen-lezen zijn. WebJobs die zijn geïmplementeerd in \site\wwwroot\app_data\jobs\... en \site\jobs\... beide worden uitgevoerd.

Notitie

Wanneer \site\wwwroot het kenmerk Alleen-lezen wordt, mislukken bewerkingen zoals het maken van de disable.job .

Problemen oplossen

  • Als het rechtstreeks vanuit een pakket wordt uitgevoerd, wordt wwwroot het kenmerk Alleen-lezen. Uw app ontvangt een foutmelding als er wordt geprobeerd bestanden naar deze map te schrijven.
  • TAR- en GZIP-indelingen worden niet ondersteund.
  • Het ZIP-bestand kan maximaal 1 GB zijn
  • Deze functie is niet compatibel met lokale cache.
  • Gebruik de lokale zip-optie (WEBSITE_RUN_FROM_PACKAGE=1) voor verbeterde prestaties bij koude start.

Meer resources