在 Azure App Service 中直接從 ZIP 套件執行應用程式

Azure App Service 中,您可以直接從部署 ZIP 套件檔案執行應用程式。 此文章將說明如何在應用程式中啟用此功能。

App Service 中的所有其他部署方法都有一些共通之處:您的檔案會部署到應用程式中的 D:\home\site\wwwroot (如果是 Linux 應用程式,則會部署到 /home/site/wwwroot)。 由於應用程式會在執行階段使用相同目錄,因此,部署可能因為檔案鎖定衝突而失敗,而且應用程式可能會因為某些檔案尚未更新而出現無法預期的行為。

相較之下,當您直接從套件執行時,不會將套件中的檔案複製到 wwwroot 目錄。 相反地,ZIP 套件本身會直接掛接為唯讀的 wwwroot 目錄。 直接從套件執行有數個優點:

  • 消除部署和執行階段之間的檔案鎖定衝突。
  • 確保只有完全部署的應用程式可隨時執行。
  • 可以部署到生產應用程式 (透過重新啟動)。
  • 提升 Azure Resource Manager 部署的效能。
  • 可縮短冷啟動時間,特別是針對具有大型 npm 套件樹狀結構的 JavaScript 函式。

注意

目前只支援 ZIP 套件檔案。

建立專案 ZIP 檔案

重要

建立部署的 ZIP 套件時,請勿包含根目錄,但只包含其中的檔案和目錄。 如果您將 GitHub 存放庫下載為 ZIP 檔案,就無法依原樣將該檔案部署至 App Service。 GitHub 會在最上層新增其他巢狀目錄,其不適用於 App Service。

在本機終端機視窗中,瀏覽至應用程式專案的根目錄。

此目錄應該包含您的 web 應用程式的項目檔案,例如 index.html、index.php 和 app.js。 也可以包含套件管理檔案,像是 project.json、composer.json、package.json、bower.json 和 requirements.txt

除非您想要 App Service 執行部署自動化,否則,請執行所有建置工作 (例如,npmbowergulpcomposerpip),並確定您擁有執行應用程式所需的所有檔案。 如果您想要直接執行套件,則需要此步驟。

在專案中建立所有項目的 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 執行下列命令。

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

WEBSITE_RUN_FROM_PACKAGE="1" 可讓您從應用程式本機的套件執行應用程式。 您也可以從遠端套件執行

執行封裝

在 App Service 中執行套件最簡單的方式是使用 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 套件名稱。 如果您以不同方式 (例如 FTP) 上傳 ZIP 套件,則必須手動建立 D:\home\data\SitePackages 目錄和 packagename.txt 檔案。

此命令也會重新啟動應用程式。 由於設定了 WEBSITE_RUN_FROM_PACKAGE,App Service 會將上傳的套件掛接為唯讀的 wwwroot 目錄,並直接從該掛接的目錄執行應用程式。

改為從外部 URL 執行

您也可以從外部 URL 執行套件,例如 Azure Blob 儲存體。 您可以使用 Azure 儲存體總管將套件檔案上傳至 Blob 儲存體帳戶。 您應該使用私人儲存體容器搭配共用存取簽章 (SAS)使用受控識別,讓 App Service 執行階段能夠安全存取套件。

將檔案上傳至 Blob 儲存體並擁有檔案的 SAS URL 之後,請將 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 儲存體,您需要重新啟動應用程式,以便將更新的套件載入到 App Service。

使用受控識別在 Azure Blob 儲存體中存取套件

Azure Blob 儲存體可設定為使用 Microsoft Entra ID 授權要求。 這表示您可以改為依賴應用程式的受控識別,而不是產生具有到期日的 SAS 金鑰。 預設將使用應用程式的系統指派身分識別。 如果您希望指定使用者指派的身分識別,可以將 WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID 應用程式設定設為該身分識別的資源識別碼。 此設定也可以接受 "SystemAssigned" 作為值,儘管這與完全省略該設定相同。

啟用使用身分識別來擷取套件:

  1. 確定已將 Blob 設定為可進行私人存取

  2. 為此身分識別授與具有套件 Blob 範圍的儲存體 Blob 資料讀者角色。 如需建立角色指派的詳細資訊,請參閱指派 Azure 角色以存取 Blob 資料

  3. WEBSITE_RUN_FROM_PACKAGE 應用程式設定設為套件的 Blob URL。 這可能是 "https://{storage-account-name}.blob.core.windows.net/{container-name}/{path-to-package}" 格式或類似格式。

從套件執行時部署 WebJob 檔案

當您從套件啟用應用程式的執行功能時,有兩種方式可以部署 WebJob 檔案:

  • 在與應用程式相同的 ZIP 套件中部署:像平常一樣將其包含在 <project-root>\app_data\jobs\... 中 (其會對應至部署路徑 \site\wwwroot\app_data\jobs\...,如 WebJobs 快速入門中所指定)。
  • 與應用程式的 ZIP 套件分開部署:由於平常的部署路徑 \site\wwwroot\app_data\jobs\... 現在是唯讀的狀態,因此您無法在該處部署 WebJob 檔案。 相反地,將 WebJob 檔案部署到不是唯讀狀態的 \site\jobs\...。 部署至 \site\wwwroot\app_data\jobs\...\site\jobs\... 的 WebJobs 都會執行。

注意

\site\wwwroot 變成唯讀狀態時,disable.job 建立等作業將會失敗。

疑難排解

  • 直接從套件執行會使 wwwroot 變成唯讀。 如果應用程式嘗試將檔案寫入到此目錄,將會收到錯誤。
  • 不支援 TAR 和 GZIP 格式。
  • ZIP 檔案最多可以是 1GB
  • 此功能與本機快取不相容。
  • 若要改善冷啟動效能,請使用本機 Zip 選項 (WEBSITE_RUN_FROM_PACKAGE=1)。

更多資源