本文說明如何建立一個現成可執行的 .zip 部署套件,將套件部署到Azure,並設定你的函式應用程式直接從該套件執行。 你可以透過使用 Azure Functions Core Tools、Azure CLI 或部署的 REST API 來部署。
基於套件的部署是從程式碼執行的功能式應用程式的預設配置。 部署技術與套件配置取決於主機計畫。 請在本文頂端選擇您的主機方案。
Azure Functions 擁有 Azure App 服務 提供的完整持續部署與整合選項。 如需詳細資訊,請參閱 Azure Functions 的持續部署。
依照託管方案進行套件部署
下表總結了每個主機計畫的部署流程及套件配置:
| 主機方案 | 部署流程 | 套件設定 |
|---|---|---|
| 彈性使用量方案 | 受管理套件部署 | 預設是從已部署的套件執行。 請勿設定 WEBSITE_RUN_FROM_PACKAGE。 |
| 進階方案 | ZIP 部署 | 將 WEBSITE_RUN_FROM_PACKAGE 設為 1,即可從已部署的套件執行。 |
| 專用 (App Service) 方案 | ZIP 部署 | 將 WEBSITE_RUN_FROM_PACKAGE 設定為 1,以從已部署的套件執行。 |
| Windows 的用電方案 | ZIP 部署 | 將 WEBSITE_RUN_FROM_PACKAGE 設定為 1,以從已部署的套件執行。 |
| Linux 上的用量方案 | 遠端建置或外部套件網址 | 使用外部套件 URL 來設定本地建置的套件。 |
| Azure 容器應用程式 | 容器映像部署 | 基於套件的程式碼部署不適用。 |
Note
本文內容與目前所選的主機方案無關。 若要選擇其他方案,請使用本文頂部的選擇器。 欲比較所有主機方案,請參閱 Azure Functions 主機選項。
Azure 容器應用程式 上託管的功能應用程式是以容器映像部署,而非 .zip 套件。 若要建立並部署基於映像的函式應用程式,請參見「在 Azure 容器應用程式 上使用程式碼建立函式應用程式」。
建立部署套件
大多數情況下,你不需要自己建立部署套件。 這些基於工具的部署方法會在發佈過程中建立套件:
- Azure Functions Core Tools
func azure functionapp publish命令。 - Visual Studio Code 發行。
- Visual Studio 發佈。
- GitHub Actions 部署,將已設定的專案路徑打包。
對於Azure Pipelines部署,管線建置步驟會建立 .zip 歸檔並將其傳遞給AzureFunctionApp部署任務。
當你需要直接使用可直接執行的部署套件時,請 使用 func pack 建立該套件。 例如,部署時可以自己建立套件,使用 外部套件網址。
你也可以手動建立 .zip 檔案庫。 手動建立檔案時,請遵守這些套件結構的要求。
部署套件需求
您部署的 zip 封存檔必須包含執行函式應用程式所需的所有檔案。 您可以使用內建 .zip 壓縮功能或非Microsoft工具,從 Functions 專案資料夾的內容手動建立 zip 封存。
封存檔必須在解壓縮後資料夾的根目錄包含 host.json 檔案。 函式應用程式的選取語言堆疊會建立其他需求:
重要事項
對於在部署時會產生已編譯輸出的語言,請務必只壓縮要發佈的輸出資料夾內容,而非整個專案資料夾。 當 Functions 解壓縮 zip 封存檔內容時,host.json 檔案必須存在於套件的根目錄。
ZIP 部署程序會將 .zip 封存檔中的檔案和資料夾解壓縮到 wwwroot 目錄中。 如果你在建立壓縮檔時包含父目錄,系統就找不到它預期會看到的檔案。wwwroot
部署套件
Flex Consumption 使用 套件部署 來將一個現成套件儲存在應用程式的部署儲存容器中。 應用程式直接從這個套件執行。 不要設定 WEBSITE_RUN_FROM_PACKAGE 應用程式的設定。
可透過 Core Tools、Visual Studio Code 或 Azure CLI 來部署套件。 這些工具會自動為 Flex Consumption 應用程式選擇合適的套件部署行為。
這些工具透過將套件送至應用程式的部署端點來執行推送部署。 對於彈性使用量,這些用戶端會在應用程式的scm主機上,將套件傳送到/api/publish。 當部署端點僅能透過私有端點連通時,執行部署的電腦、執行器或代理必須具備與私有部署端點的網路連線及 DNS 解析。 部署服務會將處理中的套件儲存在已設定的部署容器中;直接將套件上傳到這個容器並不會部署它。 若要部署而無需從啟動用戶端推送到部署端點,請使用帶有套件 URL 的 Bicep 或 ARM 範本部署,讓部署服務能存取。
使用 Azure CLI 進行部署。
請使用以下 az functionapp deployment source config-zip 指令部署套件:
az functionapp deployment source config-zip --resource-group <RESOURCE_GROUP> \
--name <APP_NAME> --src <ZIP_FILE_PATH>
當原始專案需要遠端建置時,可以加入 --build-remote true 。 不要為已經 func pack 內建成準備執行狀態的套件(例如 Go 部署套件)申請遠端建置。
若要配置部署儲存或恢復先前部署,請參閱 彈性消耗計畫中的「建立與管理功能應用程式」。
部署套件
高級、專用和消費方案應用程式都使用 zip 部署 API。 部署服務執行以下操作:
- 刪除先前部署中剩餘的檔案。
- 執行部署腳本及其他部署自訂功能。
- 撰寫部署日誌。
- 同步函式觸發程序。
重要事項
在壓縮部署中,前一次部署的檔案會被刪除或更新,儘管它們屬於該部署的一部分。 部署過程會保留你函式應用程式中其他未包含於先前部署中的檔案和目錄。 關於實作細節,請參閱 zip 部署參考。
使用 Azure CLI 進行部署。
使用 Azure CLI 來觸發推送部署。 使用 az functionapp deployment source config-zip 命令,將 .zip 檔案推送部署至函式應用程式。 若要使用此命令,您所使用的 Azure CLI 必須是 2.0.21 版或更新版本。 若要查看您使用的 Azure CLI 版本,請使用 az --version 命令。
在下列命令中,請將 <zip_file_path> 預留位置替換為 .zip 檔案所在路徑。 同時,請將 <app_name> 替換為函式應用程式的唯一名稱,並將 <resource_group> 替換為資源群組名稱。
az functionapp deployment source config-zip -g <resource_group> -n \
<app_name> --src <zip_file_path>
這個指令會將專案檔案從 .zip 檔案部署到 Azure 的函式應用程式,然後重新啟動應用程式。
當您在本機電腦上使用 Azure CLI 時,<zip_file_path> 是電腦上 .zip 檔案的路徑。 您也可以在 Azure Cloud Shell 中執行 Azure CLI。 使用 Cloud Shell 時,您必須先將部署用的 .zip 檔案上傳至與 Cloud Shell 關聯的 Azure 檔案儲存體 帳戶。 在此情況下,<zip_file_path> 是 Cloud Shell 帳戶所使用的儲存體位置。 如需詳細資訊,請參閱在 Azure Cloud Shell 中保存檔案。
使用 REST API 部署 ZIP 檔案。
您可以使用部署服務 REST API,將 .zip 檔案部署至 Azure 中的應用程式。 若要部署,請將 POST 要求傳送至 https://<app_name>.scm.azurewebsites.net/api/zipdeploy。 POST 要求的訊息本文必須包含 .zip 檔案。 要求中會使用 HTTP BASIC 驗證提供應用程式的部署認證。 如需詳細資訊,請參閱 .zip 推送部署參考。
若要使用 HTTP BASIC 驗證,您需要 App Service 的部署認證。 如需了解如何設定部署認證,請參閱設定及重設使用者層級認證。
使用 cURL。
下列範例使用 cURL 工具部署 .zip 檔案。 請替換 <deployment_user>、<zip_file_path> 與 <app_name> 預留位置。 當 cURL 提示時,請輸入密碼。
curl -X POST -u <deployment_user> --data-binary "@<zip_file_path>" https://<app_name>.scm.azurewebsites.net/api/zipdeploy
此要求會從上傳的 .zip 檔案觸發推送部署。 您可以使用 https://<app_name>.scm.azurewebsites.net/api/deployments 端點,檢閱目前與過去的部署,如下列 cURL 範例所示。 同樣地,請將 <app_name> 替換為應用程式名稱,並將 <deployment_user> 替換為部署認證的使用者名稱。
curl -u <deployment_user> https://<app_name>.scm.azurewebsites.net/api/deployments
非同步 ZIP 部署。
在同步部署時,您可能會收到與連線逾時相關的錯誤。 在 URL 中加入 ?isAsync=true 以進行非同步部署。 當 zip 檔案上傳完成後,您會立即收到回應,其中包含 Location 標頭,指向可輪詢的部署狀態 URL。 輪詢標頭中 Location 提供的 URL 時,您會在進程進行時收到 HTTP 202(已接受)回應,並在封存展開且部署順利完成之後收到 HTTP 200 (確定) 回應。
Microsoft Entra 驗證
除了使用 HTTP BASIC 驗證進行 ZIP 部署之外,也可以使用 Microsoft Entra 身分。 如果 SCM 網站停用 HTTP BASIC 驗證,可能需要Microsoft Entra 身分識別。
執行部署的使用者或服務主體需要有效的 Microsoft Entra 存取權杖。 您可以使用 Azure CLI 的 az account get-access-token 命令擷取存取權杖。 存取令牌用於 HTTP POST 要求的驗證標頭中。
curl -X POST \
--data-binary "@<zip_file_path>" \
-H "Authorization: Bearer <access_token>" \
"https://<app_name>.scm.azurewebsites.net/api/zipdeploy"
透過 PowerShell
下列範例使用 Publish-AzWebapp 上傳 .zip 檔案。 請替換 <group-name>、<app-name> 與 <zip-file-path> 預留位置。
Publish-AzWebapp -ResourceGroupName <group-name> -Name <app-name> -ArchivePath <zip-file-path>
此要求會從上傳的 .zip 檔案觸發推送部署。
若要檢閱目前與過去的部署,請執行下列命令。 同樣地,請替換 <deployment-user>、<deployment-password> 與 <app-name> 預留位置。
$username = "<deployment-user>"
$password = "<deployment-password>"
$apiUrl = "https://<app-name>.scm.azurewebsites.net/api/deployments"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username, $password)))
$userAgent = "powershell/1.0"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -UserAgent $userAgent -Method GET
使用 Bicep 或 Azure Resource Manager 範本來部署
你可以將套件部署到 Flex Consumption 應用程式,作為 Bicep 或 Azure Resource Manager(ARM)範本部署的一部分。 定義一個使用 /onedeploy 擴充功能的 Microsoft.Web/sites/extensions 資源,並在 packageUri 屬性中提供遠端套件 URL。
你必須將套件檔案命名為 released-package.zip。 Functions 主機必須能存取遠端套件 URL 及部署儲存容器。 直接把套件上傳到部署容器並不會讓它部署。
關於 Bicep 與 ARM 範本範例,請參見「定義 Flex Consumption 部署套件」。
使用 Azure Resource Manager 模板部署
你可以使用 Azure Resource Manager(ARM)範本的 ZipDeploy 擴充功能,將你的 .zip 檔案推送到函式應用程式。
範例 ZipDeploy ARM 範本
此範本同時包含生產與預備插槽,並會部署至其中之一。 通常你會用這個範本部署到暫存槽,然後切換以讓新的壓縮包在生產槽上運行。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"appServiceName": {
"type": "string"
},
"deployToProduction": {
"type": "bool",
"defaultValue": false
},
"slot": {
"type": "string",
"defaultValue": "staging"
},
"packageUri": {
"type": "secureString"
}
},
"resources": [
{
"condition": "[parameters('deployToProduction')]",
"type": "Microsoft.Web/sites/extensions",
"apiVersion": "2021-02-01",
"name": "[format('{0}/ZipDeploy', parameters('appServiceName'))]",
"properties": {
"packageUri": "[parameters('packageUri')]",
"appOffline": true
}
},
{
"condition": "[not(parameters('deployToProduction'))]",
"type": "Microsoft.Web/sites/slots/extensions",
"apiVersion": "2021-02-01",
"name": "[format('{0}/{1}/ZipDeploy', parameters('appServiceName'), parameters('slot'))]",
"properties": {
"packageUri": "[parameters('packageUri')]",
"appOffline": true
}
}
]
}
在初始部署時,直接部署到生產槽。 如需詳細資訊,請參閱插槽部署。
從部署套件執行函式。
直接從部署套件執行時,會跳過將檔案複製到目錄的 wwwroot 步驟。 相反地,Functions 執行階段會將套件掛載為唯讀的 wwwroot 目錄。 此方法:
- 減少檔案複製鎖定的問題。
- 驗證在應用程式中執行的檔案。
- 提升 Azure Resource Manager 部署效能。
- 這可以減少冷啟動時間,特別是對於擁有大型 npm 套件樹的 JavaScript 應用程式。
Flex Consumption 套件配置
Flex Consumption 應用程式預設是從一個套件中執行。 不要新增 WEBSITE_RUN_FROM_PACKAGE 應用程式設定。 部署設定,包括儲存容器及其認證方法,都是函式應用程式資源的屬性。 如需相關資訊,請參閱部署。
高級與專用套件配置
設定 WEBSITE_RUN_FROM_PACKAGE 為 1 直接從本地部署的套件執行。 執行時會將套件存放在 c:\home\data\SitePackages Windows 的資料夾或 /home/data/SitePackages Linux 的資料夾中。
用量套件設定
支援 WEBSITE_RUN_FROM_PACKAGE 的值依作業系統而定:
| 作業系統 | 價值 | 行為 |
|---|---|---|
| Windows 作業系統 | 1 |
應用程式是從資料夾裡 c:\home\data\SitePackages 的套件執行的。 |
| Linux | <URL> |
應用程式會從位於指定 URL 的套件執行。 使用一個私有的 Azure Blob 儲存體 容器,並透過管理身份存取。 |
重要事項
仍在 Linux 上以 Consumption 計畫運行即將淘汰的 v3 執行環境 的函式應用程式將於 2026 年 9 月 30 日後停止運行。 為避免服務中斷,請將 應用程式遷移到 v4 執行環境。
在 Linux 上以 Consumption 方案託管功能應用程式的選項將於 2028 年 9 月 30 日終止。 Linux 消費方案沒有新增功能或 語言版本。 在 Windows 上運行的 Consumption 方案應用程式目前不受影響。 在退休日前將應用程式遷移到 Flex Consumption 計畫。
套件部署考量
在部署並從套件執行函式應用程式時,請牢記以下需求與限制:
- 該套件必須使用 .zip 格式。 不支援 tar 與 gzip 格式。
- 最大封裝容量為 1 GB。 部署在解包專案檔案時會使用暫存空間,因此應用程式也必須有足夠的暫存空間。 耗用方案每個方案提供 500 MB 的暫存空間。
- 當您從套件執行時,
wwwroot中的檔案皆為唯讀,包括在 Azure 入口網站中也是如此。 - 執行套件時不能使用本地快取。
- 要求遠端建置時,不要設定
WEBSITE_RUN_FROM_PACKAGE。 請改為設定SCM_DO_BUILD_DURING_DEPLOYMENT=true。 在 Linux 上,也設定為ENABLE_ORYX_BUILD=true。 -
WEBSITE_RUN_FROM_PACKAGE無法與 MSDeploy 搭配運作。 改用 ZIP 部署。
新增 WEBSITE_RUN_FROM_PACKAGE 設定
有數種方式可供您新增、更新和刪除函式應用程式設定:
對函式應用程式設定的變更需要將函式應用程式重新啟動。
執行透過 ZIP 部署上傳的套件
在部署套件之前,將 WEBSITE_RUN_FROM_PACKAGE 設定為 1。 zip 部署 API 會將套件複製到資料夾, SitePackages 而不是將其內容解壓到 wwwroot。 部署同時會建立一個 packagename.txt 檔案,用以識別要掛載的套件。 應用程式重新啟動後,該套件會以唯讀的 wwwroot 目錄掛載。 Linux Consumption 應用程式不支援這個設定值,必須 從外部套件網址執行。
當部署重新啟動應用程式時,目前執行中的函式執行會終止。 關於如何撰寫能安全處理重啟的函式,請參閱 「將函式寫成無狀態」。
從外部套件 URL 執行
當你需要自己管理套件儲存時,可以使用外部套件 URL。 你需要這個選項才能在 Linux Consumption 應用程式上執行本地開發的套件。 Flex Consumption 不支援。
Note
你無法將使用 WEBSITE_RUN_FROM_PACKAGE=1 執行的現有函式應用程式,更改為從外部套件 URL 執行。 若要使用外部套件 URL,請建立一個新的函式應用程式,並設定 WEBSITE_RUN_FROM_PACKAGE 為該套件 URL。
使用私人 Blob 儲存體容器,並授與函式應用程式的受控識別對套件的存取權。 使用管理身份,因為 SAS 代幣會過期且需要維護。 每當你發佈更新的套件時,必須 手動同步觸發器。 如果你在原地更新套件且不更改 URL,請在同步觸發器前重新啟動函式應用程式。
手動將套件上傳到 Azure Blob 儲存體
建立一個 .zip 部署套件。
在 Azure 入口網站中,前往您的儲存帳戶。
在 資料儲存中,選擇 容器,然後建立或選擇私人容器。
把包裹上傳到容器裡。
選取已上傳的 blob 並複製其 URL。 如果你沒有使用管理身份,請直接產生 SAS URL。
在你的函式應用程式中,展開設定,選擇環境變數,然後在應用程式設定標籤中選擇新增。
新增一個以套件 URL 為值的設定
WEBSITE_RUN_FROM_PACKAGE。套用變更,重新啟動應用程式,並 手動同步觸發器。
使用受控識別從 Azure Blob 儲存體取得套件
你可以設定 Azure Blob 儲存體,使用 Microsoft Entra ID 來授權請求。 此設定表示您可以改為依賴應用程式的受控識別,而不是產生具有到期日的 SAS 金鑰。
預設會使用應用程式的系統指派身分識別。 如果您希望指定使用者指派的身分識別,可以將 WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID 應用程式設定設為該身分識別的資源識別碼。 此設定也可以接受 SystemAssigned 作為值,相當於略過該設定。
允許使用身分識別來擷取套件:
確定已將 Blob 設定為可進行私人存取。
為此身分識別授與具有套件 Blob 範圍的儲存體 Blob 資料讀者 (部分內容可能是機器或 AI 翻譯) 角色。 請參閱 指派 Azure 角色以存取 Blob 資料 以了解建立角色指派的細節。
將
WEBSITE_RUN_FROM_PACKAGE應用程式設定設為套件的 Blob URL。 此 URL 的形式通常是或類似於https://<storage-account-name>.blob.core.windows.net/<container-name>/<path-to-package>。如果您希望指定使用者指派的身分識別,可以將
WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID應用程式設定設為該身分識別的資源識別碼。 設定也可以接受 SystemAssigned 作為值,雖然這等同於完全省略設定。 資源標識碼是 Azure 中資源的標準表示法。 若為使用者指派受控識別,則會是/subscriptions/subid/resourcegroups/rg-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name。 使用者指派的管理身份資源 ID 可以在 設定 中的 >使用者指派的管理身份識別碼 中取得。
部署自訂設定
部署程序會假設您推送的 .zip 檔案包含可直接執行的應用程式。 預設不會執行任何自訂設定。 若要啟用與持續整合相同的建置程序,請將下列項目新增至您的應用程式設定:
SCM_DO_BUILD_DURING_DEPLOYMENT=true
當您使用 .zip 推送部署時,此設定預設為 false。 持續整合部署的預設值為 true。 當設定為 true 時,部署期間會使用您的部署相關設定。 您可以將這些設定設為應用程式設定,或放在位於 .zip 檔案根目錄的 .deployment 組態檔中。 如需詳細資訊,請參閱部署參考中的存放庫與部署相關設定。
下載您的函式應用程式檔案
如果你需要應用程式目前執行的套件,請從為應用程式部署設定的 Blob 儲存體 容器下載:
在 Azure 入口網站的功能應用程式頁面,展開設定,然後選擇部署設定。
在 應用程式套件位置中,注意用於部署的儲存帳號與容器。
進入該儲存帳號,展開資料儲存,然後選擇容器。
選擇部署容器,選擇目前的套件,然後選擇 下載。
下載的套件包含你部署的應用程式內容,可能與你的原始專案不同。 每次部署都會覆寫目前的套件,而部署容器不會提供部署歷史。
對於使用 CI/CD 部署的應用程式,請將原始碼專案保留在原始碼控制中,並依照你的發佈保留政策保留現成的建置工件。 使用保留的成品來重新部署特定發行版本。 當你需要應用程式目前執行的套件,或原始產物不再可用時,使用部署容器中的套件。
下載您的函式應用程式檔案
如果您使用 Azure 入口網站中的編輯器建立函式,您可以用下列其中一種方式,將現有的函式應用程式專案下載為 .zip 檔案:
登入 Azure 入口網站,然後前往您的函式應用程式。
在概觀索引標籤上,選取下載應用程式內容。 選取下載選項,然後選取下載。
下載的 .zip 檔案格式正確,可使用 .zip 推送部署重新發佈至您的函式應用程式。 入口網站下載也可以新增在 Visual Studio 中直接開啟函式應用程式所需的檔案。
對於使用 CI/CD 部署的應用程式,請將原始碼專案保留在原始碼控制中,並依照你的發佈保留政策保留現成的建置工件。 從倉庫下載的原始碼壓縮檔不算是部署套件。 使用你的部署工作流程來建置並部署專案。