在 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 儲存體中的容器。
使用您選擇的公用程式,為您的專案建立 .zip 套件。
在 Azure 入口網站中,搜尋您的儲存體帳戶名稱,或在儲存體帳戶中瀏覽它。
在儲存體帳戶中,選取 [資料儲存體] 底下的 [容器]。
選取 [+ 容器] 以在您的帳戶中建立新的 Blob 儲存體容器。
在 [新增容器] 頁面中,提供 [名稱] (例如 "deployments"),確定 [公用存取層級] 為 [私人],然後選取 [建立]。
選取您建立的容器,選取 [上傳],瀏覽至您使用專案建立的 .zip 檔案的位置,然後選取 [上傳]。
上傳完成後,選擇您上傳的 Blob 檔案,然後複製該 URL。 如果您未使用身分識別,可能需要產生 SAS URL
搜尋您的函式應用程式,或在 [函式應用程式] 頁面中瀏覽它。
在函式應用程式中,選取 [設定] 下的 [組態]。
在 [應用程式設定] 索引標籤中,選取 [新增應用程式設定]
輸入
WEBSITE_RUN_FROM_PACKAGE
作為 [名稱] 的值,然後將套件的 URL 貼到 Blob 儲存體中作為 [值]。選取 [確定]。 然後選取 [儲存]> [繼續] 以儲存設定並重新啟動應用程式。
現在,您可以在 Azure 中執行函式,以驗證使用部署套件 .zip 檔案的部署已成功。
下圖顯示的函式應用程式已設定為要從裝載於 Azure Blob 儲存體的 .zip 檔案來執行:
使用受控識別從 Azure Blob 儲存體擷取套件
Azure Blob 儲存體可設定為使用 Microsoft Entra ID 授權要求。 這表示您可以改為依賴應用程式的受控識別,而不是產生具有到期日的 SAS 金鑰。 預設將使用應用程式的系統指派身分識別。 如果您希望指定使用者指派的身分識別,可以將 WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID
應用程式設定設為該身分識別的資源識別碼。 此設定也可以接受 "SystemAssigned" 作為值,儘管這與完全省略該設定相同。
啟用使用身分識別來擷取套件:
確定已將 Blob 設定為可進行私人存取。
為此身分識別授與具有套件 Blob 範圍的儲存體 Blob 資料讀者角色。 如需建立角色指派的詳細資訊,請參閱指派 Azure 角色以存取 Blob 資料。
將
WEBSITE_RUN_FROM_PACKAGE
應用程式設定設為套件的 Blob URL。 這可能是 "https://{storage-account-name}.blob.core.windows.net/{container-name}/{path-to-package}" 格式或類似格式。