Hur Du Kör Din Azure Web App Från Zipfil

Att köra dina Azure Web Apps (App Services) från paket (zipfiler) är ett alternativt till den vanliga deployment modellen. Här nedan kommer jag att beskriva hur du sätter upp en paket deployment modell ("Run From Package") och vad fördelarna/nackdelarna är.

Microsoft har en beskrivning här: Run your app from a zip package. Jag kommer att förtydliga deras beskrivning här, samt även visa hur du automatiserar publiceringen.

Fördelar

Att köra dina Azure Web App (App Services) från ett paket (zipfil) ger dig ett antal fördelar:

  • Det eliminerar låsningskonflikter för filer mellan din deployment och runtime.
  • Garanterar att det alltid är endast fullt deployade appar som körs.
  • Kan användas för att deploya till produktionsmiljö (med app restart).
  • Förbättrar prestandan för Azure Resource Manager deployments.
  • Kan reducera cold-start tider, särskilt för JavaScript functions med stora npm package träd.

Tyvärr innebär det också vissa nackdelar/begränsningar:

  • Det är något mer komplicerat att sätta up.
  • Det blir inte möjligt att deploya inkrementellt. Du måste alltid göra en full deploy.
  • Det gör hela wwwroot katalogen read-only. Detta förhindrar vissa webappar, exempelvis Wordpress, från att fungera.
  • Jag har också stött på andra sällsynta fall där webappar inte beter sig som de skall när de körs från zipfiler. Du måste testa!

Sätta Upp Package Deployment i Visual Studio

Jag kommer att beskriva hur man sätter upp det för Visual Studio publishing. Det kan också sätta upp för CI/CD på ett liknande sätt.

Steg 1 - Installera Azure CLI (om du inte har det redan)

Mina instruktioner baseras på Azure CLI. Du kan ladda ned det från Microsoft här.

Steg 2 - Aktivera Package Deployment i Application Settings

Först måste du konfigurera dina Application Settings. Lägg till en ny inställning som heter WEBSITE_RUN_FROM_PACKAGE och sätt värdet till 1. Detta kan du antingen göra från Azure Portal:

Azure App Service Run From Package

Eller med hjälp av Azure CLI:

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

Steg 3 - Skapa en ny Publish Profile i Visual Studio

Välj Folder typen och kör vidare med defaultinställningar. Detta placerar outputen i bin\Release\netcoreapp3.1\publish\ i din projektmapp.

Azure App Service Folder Publish Profile

Steg 4 - Testa Manual Package Deployment

Publicera din app (med din nya Publish Profile). Gå sedan till mappen {Your project folder\bin\Release\netcoreapp3.1\publish} och skapa en zipfil med allt innehåll i mappen. Du kan göra detta i Windows genom att välja alla filer och sedan Högermusklick ≫ Skicka Till ≫ Komprimerad Mapp. Se till att zipfilen har filerna direkt i rooten.

Package Deployment zip-file

Öppna sedan en kommandoprompt och kör följande kommandon:

1az login
2az account set --subscription "your subscription name"
3az webapp deployment source config-zip --resource-group <group-name> --name <app-name> --src <your-zipfile-name>.zip

(az login och az account set är bara nödvändiga om du inte redan är inloggad genom Azure CLI)

Nu skall din zipfil vara uppladdad i mappen /home/data/SitePackages på din app service. Du kan använda SSH eller Command Prompt i Azureportalen för att kontrollera:

Azure App Service /home/data/SitePackages

Notera att du också har fått packagename.txt-filen. Den innehåller namnet på din zipfil (och kommer alltid att innehålla namnet på zipfilen som webservern skall använda).

Din zipfil skall ha monterats i read-only läge på /home/site/wwwroot. Du kan testa att försöka skapa en undermapp där. Det skall misslyckas.

Steg 5 - Automatisera Package Deployment

I Visual Studio, leta upp din Folder Publish-fil. Öppna den för redigering genom att dubbelklicka på den. Jag föreslår också att du döper om den från FolderProfile till något liknande PackageDeployment.

Visual Studio Edit Folderprofile

I publishfilen, lägg till en Target sektion som i bilden nedan.

Visual Studio Package Deployment Publish Profile

Här är koden som du skall lägga till inuti Target:

1  <Target Name="CustomActionsAfterPublish" AfterTargets="AfterPublish">
2    <PropertyGroup>
3      <ZipfileName>$([System.DateTime]::Now.ToString("yyyyMMddHHmmss")).zip</ZipfileName>
4    </PropertyGroup>
5    <ZipDirectory SourceDirectory="$(PublishUrl)" DestinationFile="$(MSBuildProjectDirectory)\bin\Release\$(ZipfileName)"/>
6    <Exec Command='az account show' WorkingDirectory="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\" ContinueOnError="true" StandardOutputImportance="low" StandardErrorImportance="low"/>
7    <Exec Command='az login' WorkingDirectory="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\" Condition="$(MSBuildLastTaskResult) == false" StandardOutputImportance="low" StandardErrorImportance="low" />
8    <Exec Command='az webapp deployment source config-zip --resource-group "my resource group" --name "my app name" --src $(MSBuildProjectDirectory)\bin\Release\$(ZipfileName)' WorkingDirectory="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\" />
9  </Target>

I koden ovanför:

  • Byt ut my resource group mot ditt eget resource group namn.
  • Byt ut my app name mot ditt eget appnamn.
  • Ändra WorkingDirectory om din Azure CLI är installerad på någon annan sökväg.

Kör din Publishing Profile. Kolla in resultatet!

Ytterligare Steg

Håll koll på /home/data/SitePackages biblioteket. Du kan behöva radera gamla zipfiler där för att undvika att få slut på lagringsutrymme.

Notera också att din website inte öppnas i din webbrowser efter publicering. Jag har inte kikat med på hur du automatiskt öppnar din Site URL, men jag tror det går att klara sig utan.

Relaterade Artiklar