Azure Functions 的 Zip 部署

本文介绍如何将函数应用项目文件从 .zip(压缩)文件部署到 Azure。 可在本文中了解如何通过 Azure CLI 和 REST API 进行推送部署。 Azure Functions 核心工具在将本地项目发布到 Azure 时也使用这些部署 API。

Zip 部署也是从部署包运行函数的一种简单方法。 有关详细信息,请参阅在 Azure 中从包文件运行函数

Azure Functions 具有完整的持续部署范围,以及由 Azure 应用服务提供的集成选项。

为了加快开发速度,你可能会发现直接通过 .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_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 文件的路径。

使用 REST API 部署 ZIP 文件

可以使用部署服务 REST API 将 .zip 文件部署到 Azure 中的应用。 若要部署,请将 POST 请求发送到 https://<app_name>.scm.chinacloudsites.cn/api/zipdeploy。 POST 请求必须在消息正文中包含此 .zip 文件。 应用的部署凭据是通过使用 HTTP BASIC 身份验证在请求中提供的。 有关详细信息,请参阅 .zip 推送部署参考

对于 HTTP 基本身份验证,需使用应用服务部署凭据。 若要了解如何设置部署凭据,请参阅设置和重置用户级别凭据

使用 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.chinacloudsites.cn/api/zipdeploy

此请求从已上传的 .zip 文件触发推送部署。 可以使用 https://<app_name>.scm.chinacloudsites.cn/api/deployments 终结点查看当前和之前的部署,如以下 cURL 示例所示。 同样,使用应用的名称替换 <app_name>;使用部署凭据的用户名替换 <deployment_user>

curl -u <deployment_user> https://<app_name>.scm.chinacloudsites.cn/api/deployments

异步 zip 部署

以同步方式进行部署时,你可能会收到连接超时相关的错误。 将 ?isAsync=true 添加到 URL 能够以异步方式进行部署。 上传 zip 文件后,你会立即收到一条响应,其中的 Location 标头指向可轮询的部署状态 URL。 在轮询 Location 标头中提供的 URL 时,你会在该过程正在进行时收到 HTTP 202(已接受)响应,并在存档已扩展并且部署成功完成时收到 HTTP 200(正常)响应。

Azure AD 身份验证

针对 zip 部署使用 HTTP 基本身份验证的替代方法是使用 Azure AD 标识。 如果 SCM 站点禁用 HTTP 基本身份验证,则可能需要 Azure AD 身份。

需要执行部署的用户或服务主体的有效 Azure AD 访问令牌。 可以使用 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.chinacloudsites.cn/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.chinacloudsites.cn/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 配置文件中进行配置。 有关详细信息,请参阅部署参考中的 Repository and deployment-related settings(存储库和与部署相关的设置)。

下载函数应用文件

如果使用 Azure 门户中的编辑器创建了函数,则可以通过以下方式之一将现有函数应用项目下载为 .zip 文件:

  • 通过 Azure 门户:

    1. 登录 Azure 门户,并转到函数应用。

    2. 在“概述”选项卡中,选择“下载应用内容”。 选择下载选项,然后选择“下载”

      下载函数应用项目

      所下载的 .zip 文件格式正确,可使用 .zip 推送部署将其重新发布到函数应用。 门户下载还可以添加在 Visual Studio 中直接打开函数应用所需的文件。

  • 使用 REST API:

    使用以下部署 GET API 从 <function_app> 项目中下载文件:

    https://<function_app>.scm.chinacloudsites.cn/api/zip/site/wwwroot/
    

    包含 /site/wwwroot/ 可确保 zip 文件仅包含函数应用项目文件,而不是整个站点。 如果尚未登录 Azure,系统会要求你登录。

还可从 GitHub 存储库下载 .zip 文件。 在以 .zip 文件形式下载 GitHub 存储库时,GitHub 会为分支添加一个额外的文件夹级别。 此额外的文件夹级别意味着无法直接部署从 GitHub 下载的 .zip 文件。

后续步骤