Azure Functions 的 ZIP 部署

本文說明如何將函式應用程式項目檔從 .zip (compressed) 檔案部署至 Azure。 您將瞭解如何使用 Azure CLI 和使用 REST API 來執行推送部署。 將本機項目發佈至 Azure 時,Azure Functions Core Tools 也會使用這些部署 API。

Zip 部署也是從部署套件執行函式的簡單方式。 若要深入瞭解,請參閱 從 Azure 中的套件檔案執行您的函式。

Azure Functions 具有 Azure App 服務 提供的完整持續部署和整合選項。 如需詳細資訊,請參閱 Azure Functions 的持續部署。

若要加快開發速度,您可能會發現直接從.zip檔案部署函式應用程式項目檔會更容易。 .zip部署 API 會取得.zip檔案的內容,並將內容擷取至 wwwroot 函式應用程式的資料夾。 此.zip檔案部署會使用相同的 Kudu 服務來提供持續整合型部署,包括:

如需詳細資訊,請參閱 .zip部署參考

部署.zip檔案需求

您用於推送部署的.zip檔案必須包含執行函式所需的所有檔案。

重要

當您使用.zip部署時,.zip檔案中找不到現有部署的任何檔案,會從函式應用程式中刪除。

特定函數應用程式中所有函式的程式碼,都位於包含主機設定檔的根專案資料夾中。 host.json 檔案內含執行階段專屬設定,且位於函式應用程式的根資料夾中。 bin 資料夾包含函數應用程式所需的套件和其他程式庫檔。 函數應用程式所需的特定資料夾結構取決於語言:

函式應用程式中的所有函式都必須共用相同的語言堆疊。

函式應用程式包含目錄中的所有檔案和資料夾 wwwroot 。 .zip檔案部署包含目錄的內容 wwwroot ,但不包含目錄本身。 部署 C# 類別庫專案時,您必須在.zip套件的子資料夾中包含編譯的連結庫檔案和相依性 bin

當您在本機計算機上開發時,您可以使用內建.zip壓縮功能或第三方工具,手動建立函式應用程式專案資料夾的.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 中的函式應用程式。 然後重新啟動應用程式。 若要檢視此函式應用程式的部署清單,您必須使用 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 ,將.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 範例所示。 同樣地,將 取代為您應用程式的名稱,並以<deployment_user>部署認證的使用者名稱取代 <app_name>

curl -u <deployment_user> https://<app_name>.scm.azurewebsites.net/api/deployments

異步 zip 部署

以同步方式部署時,您可能會收到與連線逾時相關的錯誤。 將 新增 ?isAsync=true 至 URL 以異步方式部署。 一旦 ZIP 檔案上傳 Location ,標頭指向可輪詢部署狀態 URL,您就會立即收到回應。 輪詢標頭中 Location 提供的 URL 時,當進程正在進行中時,您會收到 HTTP 202(已接受)回應,並在封存展開且部署成功完成後收到 HTTP 200 (確定) 回應。

Microsoft Entra 驗證

針對 zip 部署使用 HTTP BASIC 驗證的替代方法是使用 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 時,您的部署相關設定會在部署期間使用。 您可以將這些設定為應用程式設定,或在位於.zip檔案根目錄中的 .deployment 組態檔中。 如需詳細資訊,請參閱 部署參考中的存放庫和部署相關設定

下載函式應用程式檔案

如果您在 Azure 入口網站 中使用編輯器建立函式,您可以使用下列其中一種方式,將現有的函式應用程式專案下載為.zip檔案:

  • 從 Azure 入口網站:

    1. 登入 Azure 入口網站,然後移至您的函式應用程式。

    2. 在 [概 觀] 索引標籤上,選取 [ 下載應用程式內容]。 選取您的下載選項,然後選取 [ 下載]。

      下載函式應用程式專案

      下載的.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 存放庫來維護函式應用程式,您應該使用 持續整合 來部署應用程式。

下一步