在 Azure 中從套件檔案執行函式

在 Azure 中,您可以直接從函式應用程式中的部署套件檔案執行函式。 另一個選項是將您的檔案部署在函式應用程式的 d:\home\site\wwwroot (Windows) 或 /home/site/wwwroot (Linux) 目錄中。

本文說明從套件執行函式的優點。 文中也會說明如何在函式應用程式中啟用這項功能。

從套件檔案執行的優點

從套件檔案執行有幾項優點:

  • 減少檔案複製鎖定問題的風險。
  • 可以部署到生產應用程式 (透過重新啟動)。
  • 您可以確定在應用程式中執行的檔案。
  • 提升 Azure Resource Manager 部署的效能。
  • 可縮短冷啟動時間,特別是針對具有大型 npm 套件樹狀結構的 JavaScript 函式。

如需詳細資訊,請參閱此公告

讓函式能夠從套件執行

若要讓函式應用程式能夠從套件執行,請將 WEBSITE_RUN_FROM_PACKAGE 設定新增至函式應用程式的設定。 WEBSITE_RUN_FROM_PACKAGE 設定可具有下列其中一個值:

Description
1 指出函式應用程式會從部署在函式應用程式的 d:\home\data\SitePackages (Windows) 或 /home/data/SitePackages (Linux) 資料夾中部署的本機套件檔案執行。
<URL> 設定 URL,這是您要執行的特定套件檔案的遠端位置。 在使用量方案中,於 Linux 上執行的函式應用程式為必要。

下表指出部署至特定作業系統和裝載方案建議的 WEBSITE_RUN_FROM_PACKAGE 選項:

主控方案 Windows Linux
耗用 強烈建議使用 1 只支援 <URL>
高級 建議使用1 建議使用1
專用 建議使用1 建議使用1

一般考量

  • 套件檔案必須為 .zip 格式。 目前不支援 Tar 和 gzip 格式。
  • 建議使用 Zip 部署
  • 將函式應用程式部署至 Windows 時,您應該將 WEBSITE_RUN_FROM_PACKAGE 設定為 1,並使用 zip 部署發佈。
  • 從套件執行時,wwwroot 資料夾會變成唯讀,而您會在將檔案寫入此目錄時收到錯誤。 檔案在 Azure 入口網站中也是唯讀的。
  • 部署套件檔案的大小上限目前為 1 GB。
  • 從部署套件執行時,您無法使用本機快取。
  • 如果您的專案需要使用遠端建置,請勿使用 WEBSITE_RUN_FROM_PACKAGE 應用程式設定。 請改為新增 SCM_DO_BUILD_DURING_DEPLOYMENT=true 部署自訂應用程式設定。 針對 Linux,也新增 ENABLE_ORYX_BUILD=true 設定。 若要深入了解,請參閱遠端建置

注意

WEBSITE_RUN_FROM_PACKAGE 不適用於 MSDeploy (如這裡所述)。 您會在部署期間收到錯誤,例如 ARM-MSDeploy Deploy Failed。 請將 /MSDeploy 變更為 /ZipDeploy,以解決此錯誤。

新增 WEBSITE_RUN_FROM_PACKAGE 設定

有數種方式可供您新增、更新和刪除函式應用程式設定:

對函式應用程式設定的變更需要將函式應用程式重新啟動。

使用 WEBSITE_RUN_FROM_PACKAGE = 1

本節提供如何從本機套件檔案執行函式應用程式的相關資訊。

從現場套件部署的考量

  • 使用現場套件是從部署套件執行建議的選項,但裝載在 Linux 上的使用量方案除外。
  • Zip 部署是將部署套件上傳至您的網站的建議方式。
  • 不使用 zip 部署時,請確定 d:\home\data\SitePackages (Windows) 或 /home/data/SitePackages (Linux) 資料夾有名為 packagename.txt 的檔案。 此檔案只包含此資料夾中目前執行套件檔案的名稱,不含任何空白字元。

與 zip 部署的整合

Zip 部署是 Azure App Service 的一項功能,可讓您將函式應用程式專案部署至 wwwroot 目錄。 專案會封裝為 .zip 部署檔案。 您可以使用相同的 API 將套件部署至 d:\home\data\SitePackages (Windows) 或 /home/data/SitePackages (Linux) 資料夾。

WEBSITE_RUN_FROM_PACKAGE 應用程式設定值若為 1,zip 部署 API 就會將套件複製到 d:\home\data\SitePackages (Windows) 或 /home/data/SitePackages (Linux) 資料夾,而不會將檔案解壓縮到 d:\home\site\wwwroot (Windows) 或 /home/site/wwwroot (Linux)。 它也會建立 packagename.txt 檔案。 重新啟動之後,套件會以唯讀檔案系統形式掛接至 wwwroot。 如需 zip 部署的詳細資訊,請參閱 Azure Functions 的 zip 部署

注意

部署發生時,會觸發函式應用程式的重新啟動。 部署期間目前執行中的函式執行將會終止。 請檢閱改善 Azure Functions 的效能和可靠性,以了解如何撰寫無狀態和防禦性函式。

使用 WEBSITE_RUN_FROM_PACKAGE = URL

本節提供如何從部署至 URL 端點的套件執行函式應用程式的相關資訊。 此選項是從裝載於使用量方案的 Linux 上的套件執行唯一支援的選項。

從 URL 部署的考量

  • 在 Windows 上執行函式應用程式時,應用程式設定 WEBSITE_RUN_FROM_PACKAGE = <URL> 會提供更差的冷啟動效能,因此不建議使用。
  • 指定 URL 時,也必須在發佈更新的套件之後 手動同步觸發程序
  • Functions 執行階段必須具有存取套件 URL 的權限。
  • 您不應該將套件部署至 Azure Blob 儲存體作為公用 Blob。 請改用私人容器搭配共用存取簽章 (SAS)使用受控識別,以讓 Functions 執行階段存取該套件。
  • 您必須維護用於部署的任何 SAS URL。 SAS 到期時,就無法再部署該套件。 在此情況下,您必須產生新的 SAS,並在您的函式應用程式中更新設定。 您可以使用受控識別來排除此管理負擔。
  • 在進階方案上執行時,請務必排除冷啟動
  • 在專用方案上執行時,請確定已啟用一律開啟
  • 您可以使用 Azure 儲存體總管將套件檔案上傳至您的 Blob 儲存體帳戶中的 Blob 容器。

手動將套件上傳至 Blob 儲存體

若要在使用 URL 選項時部署壓縮的套件,您必須建立 .zip 壓縮部署套件,並將它上傳至目的地。 此範例會部署至 Blob 儲存體中的容器。

  1. 使用您選擇的公用程式,為您的專案建立 .zip 套件。

  2. Azure 入口網站中,搜尋您的儲存體帳戶名稱,或在儲存體帳戶中瀏覽它。

  3. 在儲存體帳戶中,選取 [資料儲存體] 底下的 [容器]

  4. 選取 [+ 容器] 以在您的帳戶中建立新的 Blob 儲存體容器。

  5. 在 [新增容器] 頁面中,提供 [名稱] (例如 "deployments"),確定 [公用存取層級] 為 [私人],然後選取 [建立]

  6. 選取您建立的容器,選取 [上傳],瀏覽至您使用專案建立的 .zip 檔案的位置,然後選取 [上傳]

  7. 上傳完成後,選擇您上傳的 Blob 檔案,然後複製該 URL。 如果您未使用身分識別,可能需要產生 SAS URL

  8. 搜尋您的函式應用程式,或在 [函式應用程式] 頁面中瀏覽它。

  9. 在函式應用程式中,選取 [設定] 下的 [組態]

  10. 在 [應用程式設定] 索引標籤中,選取 [新增應用程式設定]

  11. 輸入 WEBSITE_RUN_FROM_PACKAGE 作為 [名稱] 的值,然後將套件的 URL 貼到 Blob 儲存體中作為 [值]

  12. 選取 [確定]。 然後選取 [儲存]> [繼續] 以儲存設定並重新啟動應用程式。

現在,您可以在 Azure 中執行函式,以驗證使用部署套件 .zip 檔案的部署已成功。

下圖顯示的函式應用程式已設定為要從裝載於 Azure Blob 儲存體的 .zip 檔案來執行:

WEBSITE_RUN_FROM_ZIP app setting

使用受控識別從 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}" 格式或類似格式。

下一步