Azure Functions 的 Zip 部署

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

Zip 部署也​​是从 Azure 中的包文件运行函数的简单方法。 它是消耗弹性高级专用(应用服务)托管计划中的默认部署技术。 Flex 消耗计划不支持 zip 部署。

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

为了加快开发速度,你可能会发现直接通过 .zip 文件部署函数应用项目文件更为简单。 .zip 部署 API 接受 .zip 文件的内容并将内容提取到你的函数应用的 wwwroot 文件夹中。 此 .zip 文件部署使用相同的 Kudu 服务,支持基于持续集成的部署,包括:

  • 删除之前的部署留下的文件。
  • 部署自定义,包括运行部署脚本。
  • 部署日志。
  • 消耗计划函数应用中同步函数触发器。

有关详细信息,请参阅 .zip 部署参考

重要

使用 .zip 部署时,从函数应用删除现有部署中未包含在 .zip 文件内的任何文件。

部署.zip 文件的要求

部署的 zip 存档必须包含运行函数应用所需的所有文件。 可以使用内置 .zip 压缩功能或非Microsoft工具从 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(正常)响应。

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.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. 在“概述”选项卡中,选择“下载应用内容”。 选择下载选项,然后选择“下载”

    屏幕截图显示了用于下载函数应用项目的 Azure 门户页面。

    所下载的 .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 文件。

后续步骤