Запуск приложения в службе приложений Azure непосредственно из ZIP-пакета

В службе приложений Azureприложения можно запускать непосредственно из файла пакета развертывания ZIP. Здесь также показано, как включить эту функцию в приложении-функции.

Все остальные методы развертывания в службе приложений имеют что-то общее: файлы развертываются в D:\home\site\wwwroot в приложении (или /home/site/wwwroot для приложений Linux). Так как в среде выполнения приложение использует тот же каталог, развертывание может завершиться неудачей из-за конфликтов блокировки файлов, и приложение может вести себя непредсказуемо, так как некоторые файлы еще не обновлены.

В отличие от этого, при запуске непосредственно из пакета файлы в пакете не копируются в каталог wwwroot. Вместо этого сам ZIP-пакет монтируется непосредственно в каталог wwwroot только для чтения. Существует несколько преимуществ, выполняемых непосредственно из пакета:

  • Устраняет конфликты блокировки файлов между развертыванием и средой выполнения.
  • Гарантирует, что в любое время выполняются только полностью развернутые приложения.
  • Можно выполнить развертывание в рабочее приложение (с помощью перезапуска).
  • Повышается производительность развертываний Azure Resource Manager.
  • Может сократиться время "холодного запуска", особенно для функций JavaScript с большими деревьями пакетов npm.

Примечание.

В настоящее время поддерживаются только ZIP-файлы пакета.

Создание ZIP-пакета проекта

Важно!

При создании ZIP-пакета для развертывания не включайте корневой каталог, а только файлы и каталоги. При скачивании репозитория GitHub в виде ZIP-файла невозможно развернуть этот файл как есть в Служба приложений. GitHub добавляет дополнительные вложенные каталоги на верхнем уровне, которые не работают с Служба приложений.

В окне терминала на локальном компьютере перейдите к корневому каталогу проекта приложения.

Этот каталог должен содержать файл записи веб-приложения, например index.html, index.php и app.js. Кроме того, в нем могут содержаться файлы управления пакетами, например project.json, composer.json, package.json, bower.json и requirements.txt.

Если вы не хотите, чтобы Служба приложений выполняла автоматизацию развертывания, выполните все задачи сборки (например npm, bower, gulp, composer и pip) и убедитесь, что у вас есть все файлы, необходимые для запуска приложения. Этот шаг является обязательным, если вы хотите запустить пакет напрямую.

Создайте ZIP-архив всего содержимого проекта. Для dotnet проектов это все в выходном каталоге dotnet publish команды (за исключением самого выходного каталога). Например, следующая команда в терминале для создания ZIP-пакета содержимого текущего каталога:

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

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

Включить запуск из пакета

Параметр приложения WEBSITE_RUN_FROM_PACKAGE включает запуск из пакета. Чтобы задать его, запустите следующую команду с помощью Azure CLI в Linux.

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

WEBSITE_RUN_FROM_PACKAGE="1" позволяет запускать приложение из пакета, который является локальным для приложения. Можно также запустить из удаленного пакета.

Запуск пакета

Проще всего запустить пакет в службе приложений с помощью команды Azure CLI AZ webapp Deployment Source config-ZIP. Например:

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

Так как WEBSITE_RUN_FROM_PACKAGE параметр приложения задан, эта команда не извлекает содержимое пакета в каталог D:\home\site\wwwroot приложения. Вместо этого он передает ZIP-файл "как есть" в D:\home\data\SitePackages и создает packagename.txt в том же каталоге, который содержит имя ZIP-пакета для загрузки во время выполнения. При отправке ZIP-пакета другим способом (например, FTP) необходимо создать каталог D:\home\data\SitePackages и файл packagename.txt вручную.

Команда также перезапускает приложение. Так как параметр WEBSITE_RUN_FROM_PACKAGE задан, служба приложений подключает отправленный пакет как каталог wwwroot только для чтения и запускает приложение непосредственно из этого подключенного каталога.

Запустить из внешнего URL-адреса

Вы также можете запустить пакет с внешнего URL-адреса, например Хранилища BLOB-объектов Azure. Можно использовать Обозреватель службы хранилища Azure для передачи файлов пакета в учетную запись хранения больших двоичных объектов. Следует использовать закрытый контейнер хранилища с подписанным URL-адресом (SAS) или использовать управляемое удостоверение, чтобы настроить безопасный доступ к пакету в среде Службы приложений.

Когда вы отправите файл в хранилище BLOB-объектов и получите для него URL для SAS, задайте WEBSITE_RUN_FROM_PACKAGE для параметра приложения URL-адрес. В приведенном ниже примере показано, как сделать это с помощью 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"

При публикации обновленного пакета с тем же именем в хранилище BLOB-объектов необходимо перезапустить приложение, чтобы обновленный пакет загружался в службу приложений.

Доступ к пакету в Хранилище BLOB-объектов Azure с помощью управляемого удостоверения

Хранилище BLOB-объектов Azure можно настроить для авторизации запросов с помощью идентификатора Microsoft Entra. Это означает, что вместо создания ключа SAS с определенным сроком действия можно использовать управляемое удостоверение приложения. По умолчанию будет использоваться назначаемое системой удостоверение приложения. Если вы хотите указать назначаемое пользователем удостоверение, можно задать параметр приложения WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID для ИД ресурса этого удостоверения. Параметр также может принимать в качестве значения "SystemAssigned", хотя это то же самое, что и полное исключение параметра.

Чтобы разрешить получение пакета с помощью удостоверения, выполните следующие действия:

  1. Убедитесь, что большой двоичный объект настроен для частного доступа.

  2. Предоставьте удостоверению роль Читатель данных больших двоичных объектов хранилища с областью действия для большого двоичного объекта пакета. Дополнительные сведения о создании назначения ролей см. в статье Назначение роли Azure для доступа к данным BLOB-объектов.

  3. Задайте параметр приложения WEBSITE_RUN_FROM_PACKAGE для URL-адреса большого двоичного объекта пакета. Этот URL-адрес будет представлен в формате: https://{имя_учетной_записи_хранения}.blob.core.windows.net/{имя_контейнера}/{путь_к_пакету} (или подобном).

Развертывание файлов веб-заданий при запуске из пакета

При включении запуска приложения из пакета можно развернуть два способа развертывания файлов веб-заданий:

  • Разверните в том же ZIP-пакете, что и приложение: включите их, как правило, (которое сопоставляется с путем \site\wwwroot\app_data\jobs\... развертывания, как указано в <project-root>\app_data\jobs\... кратком руководстве по веб-заданиям).
  • Развертывание отдельно от ZIP-пакета приложения: так как обычный путь \site\wwwroot\app_data\jobs\... развертывания теперь доступен только для чтения, вы не можете развернуть файлы веб-заданий там. Вместо этого разверните файлы веб-заданий в \site\jobs\..., в котором не только чтение. Веб-задания, развернутые в \site\wwwroot\app_data\jobs\... и \site\jobs\... в обоих запусках.

Примечание.

Когда \site\wwwroot становится доступным только для чтения, операции, такие как создание disable.job, завершаются сбоем.

Устранение неполадок

  • Выполнение непосредственно из пакета делает его wwwroot доступным только для чтения. При попытке записи файлов в этот каталог приложение получит сообщение об ошибке.
  • Форматы TAR и GZIP не поддерживаются.
  • ZIP-файл может содержать не более 1 ГБ
  • Эта функция несовместима с локальным кэшем.
  • Для повышения производительности холодного запуска используйте параметр local ZIP (WEBSITE_RUN_FROM_PACKAGE = 1).

Дополнительные ресурсы