Direktes Ausführen Ihrer App in Azure App Service aus einem ZIP-Paket

In Azure App Service können Sie Ihre Apps direkt aus einer ZIP-Bereitstellungspaketdatei ausführen. In diesem Artikel erfahren Sie, wie Sie diese Funktion in Ihrer App aktivieren.

Alle anderen Bereitstellungsmethoden in App Service haben eines gemeinsam: Ihre Dateien werden unter D:\home\site\wwwroot in Ihrer App bereitgestellt (bei Linux-Apps unter /home/site/wwwroot). Da dieses Verzeichnis zur Laufzeit von Ihrer App verwendet wird, kann es vorkommen, dass die Bereitstellung aufgrund von Dateisperrkonflikten nicht erfolgreich ist und dass sich die App unvorhersehbar verhält, da einige der Dateien noch nicht aktualisiert wurden.

Wenn Sie die App dagegen direkt aus einem Paket ausführen, werden die Dateien im Paket nicht in das Verzeichnis wwwroot kopiert. Stattdessen wird das eigentliche ZIP-Paket direkt als schreibgeschütztes Verzeichnis wwwroot eingebunden. Die direkte Ausführung aus einem Paket hat mehrere Vorteile:

  • Keine Dateisperrkonflikte zwischen Bereitstellung und Laufzeit.
  • Gewährleistet, dass immer nur vollständig bereitgestellte Apps ausgeführt werden.
  • Kann in einer Produktions-App (mit Neustart) bereitgestellt werden.
  • Verbessert die Leistung von Azure Resource Manager-Bereitstellungen.
  • Kann Kaltstartzeiten verringern, insbesondere für JavaScript-Funktionen mit großen npm-Paketstrukturen.

Hinweis

Derzeit werden nur ZIP-Paketdateien unterstützt.

Erstellen eines ZIP-Pakets für das Projekt

Wichtig

Schließen Sie beim Erstellen des ZIP-Pakets für die Bereitstellung nicht das Stammverzeichnis, sondern nur die darin enthaltenen Dateien und Verzeichnisse ein. Wenn Sie ein GitHub-Repository als ZIP-Datei herunterladen, können Sie diese Datei nicht unverändert in App Service bereitstellen. GitHub fügt auf der obersten Ebene zusätzliche geschachtelte Verzeichnisse hinzu, die nicht mit App Service funktionieren.

Navigieren Sie in einem lokalen Terminalfenster zum Stammverzeichnis Ihres App-Projekts.

Dieses Verzeichnis sollte die Eingabedatei für Ihre Web-App enthalten, z.B. index.html, index.php oder app.js. Sie kann auch Dateien zur Paketverwaltung enthalten, z.B. project.json, composer.json, package.json, bower.json oder requirements.txt.

Wenn Sie nicht möchten, dass App Service die Bereitstellungsautomatisierung für Sie ausführt, führen Sie alle Buildaufgaben (z. B. npm, bower, gulp, composer und pip) aus, und stellen Sie sicher, dass Sie über alle Dateien verfügen, die Sie zum Ausführen der App benötigen. Dieser Schritt ist erforderlich, wenn Sie Ihr Paket direkt ausführen möchten.

Erstellen Sie ein ZIP-Archiv mit allen Elementen Ihres Projekts. Bei dotnet-Projekten handelt es sich dabei um den gesamten Inhalt im Ausgabeverzeichnis des dotnet publish-Befehls (mit Ausnahme des Ausgabeverzeichnisses selbst). Führen Sie beispielsweise den folgenden Befehl in Ihrem Terminal aus, um ein ZIP-Paket mit dem Inhalt des aktuellen Verzeichnisses zu erstellen:

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

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

Ermöglichen der Ausführung aus einem Paket

Die Ausführung aus einem Paket wird durch die App-Einstellung WEBSITE_RUN_FROM_PACKAGE ermöglicht. Führen Sie zum Festlegen dieser Einstellung den folgenden Befehl über die Azure-Befehlszeilenschnittstelle aus:

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

Mit WEBSITE_RUN_FROM_PACKAGE="1" können Sie Ihre App aus einem für Ihre App lokalen Paket ausführen. Es besteht aber auch die Möglichkeit zum Ausführen aus einem Remotepaket.

Ausführen des Pakets

Die einfachste Möglichkeit zum Ausführen eines Pakets in App Service stellt der Azure CLI-Befehl az webapp deployment source config-zip dar. Beispiel:

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

Da die App-Einstellung WEBSITE_RUN_FROM_PACKAGE festgelegt ist, wird der Paketinhalt durch diesen Befehl nicht in das Verzeichnis D:\home\site\wwwroot Ihrer App extrahiert. Stattdessen wird die ZIP-Datei unverändert in D:\home\data\SitePackageshochgeladen, und es wird eine Datei namens packagename.txt im gleichen Verzeichnis erstellt, die den Namen des ZIP-Pakets enthält, das zur Laufzeit geladen werden soll. Wenn Sie Ihr ZIP-Paket auf andere Weise hochladen (beispielsweise per FTP), müssen Sie das Verzeichnis D:\home\data\SitePackages und die Datei packagename.txt manuell erstellen.

Durch den Befehl wird die App außerdem neu gestartet. Da WEBSITE_RUN_FROM_PACKAGE festgelegt ist, bindet App Service das hochgeladene Paket als schreibgeschütztes Verzeichnis wwwroot ein und führt die App direkt aus diesem eingebundenen Verzeichnis aus.

Ausführen von einer externen URL aus

Ein Paket kann auch von einer externen URL aus (beispielsweise Azure Blob Storage) ausgeführt werden. Sie können den Azure Storage-Explorer zum Hochladen von Dateien in Ihr Blob Storage-Konto verwenden. Es empfiehlt sich, einen privaten Speichercontainer mit einer Shared Access Signature (SAS) oder eine verwaltete Identität zu verwenden, damit die App Service-Runtime sicher auf das Paket zugreifen kann.

Wenn Sie Ihre Datei in Blob Storage hochgeladen haben und über eine SAS-URL für die Datei verfügen, können Sie die App-Einstellung WEBSITE_RUN_FROM_PACKAGE auf die URL festlegen. Im folgenden Beispiel wird dazu die Azure-Befehlszeilenschnittstelle verwendet:

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"

Wenn Sie ein aktualisiertes Paket mit dem gleichen Namen in Blob Storage veröffentlichen, müssen Sie Ihre App neu starten, damit das aktualisierte Paket in App Service geladen wird.

Zugreifen auf ein Paket in Azure Blob Storage mithilfe einer verwalteten Identität

Azure Blob Storage kann für die Autorisierung von Anforderungen mit Microsoft Entra ID konfiguriert werden. Das bedeutet, dass Sie keinen SAS-Schlüssel mit Ablauf generieren müssen, sondern stattdessen die verwaltete Identität der Anwendung verwenden können. Standardmäßig wird die systemseitig zugewiesene Identität der App verwendet. Wenn Sie eine vom Benutzer zugewiesene Identität angeben möchten, können Sie die App-Einstellung WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID auf die Ressourcen-ID dieser Identität festlegen. Für die Einstellung wird zwar auch „SystemAssigned“ (Systemseitig zugewiesen) als Wert akzeptiert, dies hat jedoch das gleiche Ergebnis wie das Weglassen der Einstellung.

So ermöglichen Sie das Abrufen des Pakets unter Verwendung der Identität:

  1. Vergewissern Sie sich, dass das Blob für privaten Zugriff konfiguriert ist.

  2. Erteilen Sie der Identität die Rolle Storage-Blobdatenleser mit dem Bereich für das Paketblob. Ausführliche Informationen zum Erstellen der Rollenzuweisung finden Sie unter Zuweisen einer Azure-Rolle für den Zugriff auf Blobdaten.

  3. Legen Sie die Anwendungseinstellung WEBSITE_RUN_FROM_PACKAGE auf die Blob-URL des Pakets fest. Diese hat wahrscheinlich das Format „https://{Speicherkontoname}.blob.core.windows.net/{Containername}/{Pfad zum Paket}“ oder ein ähnliches Format.

Bereitstellen von WebJob-Dateien beim Ausführen aus einem Paket

Es gibt zwei Möglichkeiten zum Bereitstellen von WebJob-Dateien, wenn Sie die Ausführung einer App aus einem Paket aktivieren:

  • Bereitstellen im selben ZIP-Paket wie Ihre App: Schließen Sie sie wie gewohnt in <project-root>\app_data\jobs\... ein (was dem im \site\wwwroot\app_data\jobs\...WebJobs-Schnellstart angegebenen Bereitstellungspfad zugeordnet wird).
  • Gesondertes Bereitstellen vom ZIP-Paket Ihrer App: Da der übliche Bereitstellungspfad \site\wwwroot\app_data\jobs\... jetzt schreibgeschützt ist, können Sie dort keine WebJob-Dateien bereitstellen. Stellen Sie stattdessen WebJob-Dateien in \site\jobs\... bereit, der nicht schreibgeschützt ist. Sowohl in \site\wwwroot\app_data\jobs\... als auch in \site\jobs\... bereitgestellte WebJobs funktionieren und werden ausgeführt.

Hinweis

Wenn \site\wwwroot schreibgeschützt wird, schlagen Vorgänge wie die Erstellung von disable.job fehl.

Problembehandlung

  • Beim direkten Ausführen aus einem Paket wird wwwroot schreibgeschützt. Wenn Ihre App versucht, Dateien in dieses Verzeichnis zu schreiben, tritt ein Fehler auf.
  • Das TAR- und das GZIP-Format werden nicht unterstützt.
  • Die ZIP-Datei kann höchstens 1 GB groß sein.
  • Dieses Feature ist nicht mit lokalem Cache kompatibel.
  • Um die Kaltstartleistung zu verbessern, verwenden Sie die lokale ZIP-Option (WEBSITE_RUN_FROM_PACKAGE=1).

Weitere Ressourcen