Azure Functions 的 ZIP 部署
本文會說明如何從 .zip (壓縮) 檔案將函式應用程式的專案檔部署至 Azure。 您將了解如何藉由使用 Azure CLI 和使用 REST API 來進行推送部署。 Azure Functions Core Tools 也會在將本機專案發佈至 Azure 時,使用這些部署 API。
Zip 部署也是從 Azure 中的套件檔案執行函式的簡單方式。 這是取用、彈性進階和專用 (App Service) 主控方案中的預設部署技術。 Flex Consumption 方案不支援 zip 部署。
Azure Functions 擁有 Azure App Service 所提供的全套持續部署與整合選項。 如需詳細資訊,請參閱 Azure Functions 的持續部署。
若要加快開發速度,您可能會發現直接從 .ZIP 檔案部署函數應用程式專案檔會比較容易。 .zip 部署 API 會取得 .zip 檔案的內容,並將內容擷取至函式應用程式的 wwwroot
資料夾。 此 .zip 檔案部署所使用的是支援持續整合式部署的同一個 Kudu 服務,包括:
- 刪除較舊部署所留下的檔案。
- 部署自訂,包括執行中的部署指令碼。
- 部署記錄。
- 同步處理取用方案函式應用程式中的函式觸發程序。
如需詳細資訊,請參閱 .zip 部署參考。
重要
當您使用 .zip 部署時,.zip 檔案中找不到的現有部署檔案,都會從函式應用程式中刪除。
.zip 部署檔案需求
您部署的 Zip 封存檔必須包含執行函數應用程式所需的所有檔案。 您可以使用內建的 .zip 壓縮功能或第三方工具,從 Functions 專案資料夾的內容手動建立 Zip 封存檔。
封存檔在解壓縮的資料夾根目錄中必須包含 host.json 檔案。 針對函數應用程式選取的語言堆疊會產生其他需求:
重要
針對為部署產生編譯輸出的語言,請確保壓縮您計劃發行的輸出資料夾內容,而不是整個專案資料夾。 當 Functions 擷取 zip 封存的內容時,host.json
檔案必須存在於套件的根目錄中。
Zip 部署程序會在 wwwroot
目錄中解壓縮 Zip 封存檔的檔案和資料夾。 如果您在建立封存檔時包含父目錄,則系統將會找不到預期在 wwwroot
中看到的檔案。
使用 Azure CLI 進行部署
您可以使用 Azure CLI 來觸發推送部署。 請使用 az functionapp deployment source config-zip 命令,將 .zip 檔案推送部署至函式應用程式。 若要使用此命令,您所使用的 Azure CLI 必須是 2.0.21 版或更新版本。 若要了解您所使用的 Azure CLI 版本,請使用 az --version
命令。
在下列命令中,使用 .zip 檔案的位置路徑取代 <zip_file_path>
預留位置。 此外,請以函數應用程式的唯一名稱取代 <app_name>
,並以資源群組的名稱取代 <resource_group>
。
az functionapp deployment source config-zip -g <resource_group> -n \
<app_name> --src <zip_file_path>
此命令會將專案檔從所下載的 .zip 檔案部署到您在 Azure 中的函式應用程式。 然後重新啟動應用程式。 若要檢視此函式應用程式的部署清單,您必須使用 REST API。
當您在本機電腦上使用 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,在 Azure 中將 .zip 檔案部署至您的應用程式。 若要部署,請將 POST 要求傳送至 https://<app_name>.scm.azurewebsites.net/api/zipdeploy
。 POST 要求必須在訊息本文中包含 .zip 檔案。 系統會使用 HTTP 基本驗證,在要求中提供應用程式的部署認證。 如需詳細資訊,請參閱 .zip 推送部署參考。
針對 HTTP 基本驗證,您需要 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 部署
同步部署時,您可能會收到與連線逾時相關的錯誤。 將 ?isAsync=true
新增至 URL 以非同步部署。 上傳 ZIP 檔案及指向可輪詢部署狀態 URL 的 Location
標頭之後,您就會收到回應。 輪詢標頭中 Location
提供的 URL 時,您會在流程進行時收到 HTTP 202 (已接受) 回應,以及在封存展開且成功完成部署之後,收到 HTTP 200 (OK) 回應。
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
使用 ARM 範本進行部署
您可以使用 ZipDeploy ARM 範本延伸模組,以將 .zip 檔案推送至函數應用程式。
範例 ZipDeploy ARM 範本
此範本同時包含生產環境與預備位置,並部署至兩者之一的位置。 一般而言,您會使用此範本來部署至預備位置,然後交換,以取得在生產位置上執行的新 zip 套件。
{
"$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
目錄的內容會變成唯讀狀態。
ZIP 部署會與這項功能整合,藉由將函式應用程式的設定 WEBSITE_RUN_FROM_PACKAGE
設定為值 1
即可加以啟用。 如需詳細資訊,請參閱從部署套件檔案執行函式。
部署自訂
部署程序假設您所推送的 .zip 檔案包含隨時可執行的應用程式。 根據預設,系統不會執行任何自訂。 若要啟用您在持續整合所獲得的相同建置程序,請將下列內容新增至您的應用程式設定:
SCM_DO_BUILD_DURING_DEPLOYMENT=true
當您使用 .zip 推送部署時,這項設定的預設值是 false。 持續整合部署的預設值則是 true。 設定為 true 時,系統會在部署期間使用您的部署相關設定。 您可以將這些設定設定為應用程式設定或設定於 .deployment 設定檔 (位於 .zip 檔案的根目錄) 中。 如需詳細資訊,請參閱部署參考中的存放庫和部署相關設定。
下載函式應用程式檔案
如果您已在 Azure 入口網站中使用編輯器建立函式,您可以使用下列其中一種方式,將現有的函數應用程式專案下載為 .ZIP 檔案:
從 Azure 入口網站:
登入 Azure 入口網站,然後移至您的函式應用程式。
在 [概觀] 索引標籤上,選取 [下載應用程式內容]。 選取下載選項,然後選取 [下載]。
所下載的 .zip 檔案會採用正確格式,以便您可以使用 .zip 推送部署加以重新發佈至函式應用程式。 入口網站下載也可新增直接在 Visual Studio 中開啟您函式應用程式所需的檔案。
使用 REST API:
使用下列部署 GET API 從您的
<function_app>
專案下載檔案:https://<function_app>.scm.azurewebsites.net/api/zip/site/wwwroot/
包括
/site/wwwroot/
可確保您的 zip 檔案僅包含函式應用程式專案檔案,而不是整個站台。 如果您尚未登入 Azure,系統會要求您登入。
您也可以從 GitHub 存放庫下載 .zip 檔案。 當您將 GitHub 存放庫下載為 .zip 檔案時,GitHub 會為分支新增額外的資料夾層級。 這個額外的資料夾層級表示,由於您是從 GitHub 下載 .zip 檔案,所以無法直接部署該檔案。 如果您使用 GitHub 存放庫來維護函式應用程式,請使用持續整合來部署應用程式。