共用方式為

Azure Functions 中的部署技术

可以使用多种不同的技术将 Azure Functions 项目代码部署到 Azure。 本文概述了可用的部署方法,以及在各种方案中使用的最佳方法建议。 它还提供了有关基础部署技术的综合列表和关键详细信息。

部署方法

用于将代码发布到 Azure 中的函数应用的部署技术取决于特定需求和在开发周期中所处的阶段。 例如,在开发和测试期间,可以直接从开发工具(如 Visual Studio Code)进行部署。 当应用处于生产阶段时,你更有可能从源代码管理或使用自动发布管道(其中可能包括验证和测试)持续发布。

下表介绍了代码项目的可用部署方法。

部署类型 方法 最适用于...
基于工具 Azure CLI
Visual Studio Code 发布
Visual Studio 发布
Core Tools 发布
开发期间的部署和其他临时部署。 使用 本地开发工具按需部署代码。
应用服务托管 • 部署中心 (CI/CD)
• 容器部署
从源代码管理或容器注册表进行持续部署 (CI/CD)。 应用服务平台 (Kudu) 管理部署。
外部管道 GitHub Actions 包括验证、测试和其他操作的生产流水线,这些操作必须作为自动化部署的一部分运行。 管道管理部署。

针对特定方案使用最佳技术。 很多部署方式都基于压缩部署,这是建议的部署方法。

部署技术的可用性

部署方法还取决于运行函数应用的托管计划和操作系统。

目前,Functions 提供 5 个选项用于托管函数应用:

每种计划有不同的行为。 并非所有部署技术都适用于每个托管计划和操作系统。 此图表提供有关支持的部署技术的信息:

部署技术 Flex 消耗 消耗 弹性高级版 专属 容器应用
一次部署
Zip 部署
外部包 URL1
Docker 容器 仅限 Linux 仅限 Linux 仅限 Linux
源代码管理 仅限 Windows
本地 Git1 仅限 Windows
FTPS1 仅限 Windows
门户内编辑2

1 不建议使用需要手动同步触发器的部署技术。
2 当代码从门户外部部署到您的函数应用时,门户内的编辑功能将被禁用。 有关详细信息(包括门户内编辑的语言支持详细信息),请参阅语言支持详细信息

关键概念

若要了解 Azure Functions 中的部署工作原理,必须先掌握一些关键概念。

触发器同步

更改任何触发器时,Functions 运行架构必须知晓这些更改。 对于许多部署技术而言,同步会自动进行。 但在某些情况下,必须手动同步触发器。

使用这些部署选项时,必须始终手动同步触发器:

可以通过以下方式之一手动同步触发器:

  • 在 Azure 门户中重启函数应用。 Functions 主机在应用程序启动后执行后台触发器同步。

  • 使用 az rest 命令发送调用 syncfunctiontriggers API 的 HTTP POST 请求,如以下示例所示:

    az rest --method post --url https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.Web/sites/<APP_NAME>/syncfunctiontriggers?api-version=2016-08-01
    

在进行同步触发器操作时,请记住以下注意:

  • 每次使用相同的外部包 URL 部署更新版本的部署包时,都必须手动重启函数应用。
  • 在消耗计划或弹性高级计划中运行的应用程序中,您还必须在以下情况下手动同步触发器
    • 当部署使用基于资源管理器的部署的外部包 URL 时,请使用 ARM 模板或 Bicep 或 Terraform 文件。
    • 使用相同的外部包 URL 原地更新部署软件包时。
  • 向现有函数应用添加网络限制时,必须保证连接到应用设置中 AzureWebJobsStorage 设置的默认主机存储帐户。 有关详细信息,请参阅 如何将受保护的存储帐户与 Azure Functions 配合使用

远程生成

可以在部署期间请求 Azure Functions 执行代码项目的远程生成。 在这些情况下,请求远程生成而不是在本地生成:

  • 你要将应用部署到在 Windows 计算机上开发的基于 Linux 的函数应用。 这种情况通常适用于 Python 应用开发。 在 Windows 本地生成部署包时,最终可能会生成不正确的库。
  • 项目依赖于自定义包索引
  • 你希望减小部署包的大小。

请求远程生成的方式取决于你的应用是在 Windows 还是 Linux 上的 Azure 中运行。

在 Windows 上运行的所有函数应用都有一个小的管理应用,称为由 Kudu 提供的 scm 站点。 该站点会处理 Azure Functions 的很多部署和生成逻辑。

将应用部署到 Windows 时,部署过程会运行特定于语言的命令,例如 dotnet restore (C#) 或 npm install (JavaScript)。

在部署期间使用远程生成时,应注意以下事项:

  • 在消耗计划中运行在 Linux 上的函数应用程序支持远程构建。 但是,这些应用的部署选项受到限制,因为它们没有 scm (Kudu) 站点。
  • 高级计划专用(应用服务)计划中,Linux 上运行的函数应用则具有 scm (Kudu) 站点,但与 Windows 上运行的函数应用相比,它们是受限的。
  • 当应用使用 从包运行时,不会发生远程生成。 若要了解如何在这些情况下使用远程生成,请参阅 Zip 部署
  • 在功能可用之前(2019 年 8 月 1 日)创建应用时,可能会遇到远程生成问题。 对于较旧的应用,请创建新的函数应用或运行 az functionapp update --resource-group <RESOURCE_GROUP_NAME> --name <APP_NAME> 以更新函数应用。 此命令可能需要尝试两次才能成功。

应用内容存储

基于包的部署方法将包存储在与 AzureWebJobsStorage 设置定义的函数应用关联的存储帐户中。 当可用时,消费计划应用和弹性高级计划应用尝试使用此帐户中的 Azure Files 内容共享,但你也可以将包置于其他位置。 弹性消费计划应用程序使用默认存储帐户中的一个存储容器,除非您 将一个其他存储帐户配置为用于部署。 如需更多信息,请参阅下一部分介绍的每种部署技术的“应用内容存储位置”中的详细信息。

重要

存储帐户用于存储重要的应用数据,有时包括应用程序代码本身。 应限制其他应用和用户对存储帐户的访问。

部署技术详细信息

Azure Functions 中提供了以下部署方法。 若要确定每个托管计划支持哪些技术,请参阅 部署技术可用性 表。

一次部署

One deploy 是 Flex 消耗计划中应用支持的唯一部署技术。 最终的结果是一个可以立即运行的 .zip 包,您的函数应用程序运行在其上。

如何使用它: 使用 Visual Studio Code 发布功能或通过 Azure Functions Core ToolsAzure CLI 从命令行进行部署。 我们的GitHub Action在检测到部署到 Flex 消耗应用时,同样利用“单次部署”功能。

创建 Flex Consumption 应用时,必须指定部署存储(blob)容器以及身份验证方法。 默认情况下,使用与 AzureWebJobsStorage 连接相同的存储帐户,连接字符串作为身份验证方法。 因此,部署设置是在应用创建期间配置的,无需应用程序设置。

使用方法:One deploy 是 Flex 消耗计划上运行的函数应用唯一可用的部署技术

应用内容存储位置:创建 Flex 消耗函数应用时,指定部署存储容器。 此 Blob 容器是工具上传部署的应用内容的位置。 若要更改位置,可访问 Azure 门户中的“部署设置”边栏选项卡,或者使用 Azure CLI

小窍门

Azure 门户中提供了 弹性消耗部署 诊断工具。 打开您的 Flex Consumption 应用程序,选择诊断并解决问题,然后搜索Flex Consumption Deployment。 此工具显示有关部署的详细信息,包括部署历史记录、包状态和故障排除建议。

Zip 部署

Zip deploy 是消耗计划、弹性高级计划和应用服务(专用)计划中函数应用的默认部署技术,也是推荐的部署技术。 最终的结果是一个可供您的函数应用运行的 .zip 包。 它不同于 外部包 URL ,即平台负责远程生成和存储应用内容。

使用方法:使用偏爱的客户端工具进行部署:Visual Studio CodeVisual Studio,或者使用 Azure Functions Core ToolsAzure CLI 从命令行部署。 我们的 GitHub 操作同样利用 zip deploy。

使用压缩部署方法时,可将应用设置为从包运行。 若要从包运行,请将 WEBSITE_RUN_FROM_PACKAGE 应用程序设置值设置为 1。 我们建议使用压缩部署。 此方法可以缩短应用程序加载时间,并且是 VS Code、Visual Studio 和 Azure CLI 的默认部署方法。

使用方法:Zip deploy 是 Windows 消耗计划、Windows 和 Linux 弹性高级计划以及 Windows 和 Linux 应用服务(专用)计划中函数应用的默认部署技术,也是推荐的部署技术。

存储应用内容的位置: zip 部署中的应用内容默认存储在文件系统上,Azure 可能会将您在创建函数应用时指定的存储帐户中的 Azure 文件用作支持。 在 Linux 消耗计划中,应用程序内容改为存储在应用设置中指定的存储帐户中的 Blob 上,应用设置 AzureWebJobsStorage 采用 Blob URL 作为值。

外部软件包 URL

如果要手动控制部署的执行方式,则外部包 URL 是一个选项。 你负责将包含已构建应用内容的现成 .zip 包上传到 Blob 存储,并将此外部 URL 引用为函数应用的应用程序设置。 每当应用重启时,它会提取包、装载包并在从包运行模式下运行。

如何使用:将 添加到应用程序设置。 此设置的值应是一个 Blob URL,它指向你希望应用运行的特定包的位置。 可以在门户中使用 Azure CLI 来添加设置。

如果使用 Azure Blob 存储,函数应用可以使用基于托管标识的连接或共享访问签名 (SAS) 来访问容器。 选择的选项会影响你用作WEBSITE_RUN_FROM_PACKAGE值的 URL 类型。 建议使用托管标识实现整体安全性,并且因为 SAS 令牌过期,必须手动维护。

每次部署函数应用所引用的包文件时,都必须手动同步触发器,包括初始部署。 如果你更改包文件的内容但不更改 URL 本身,还必须重启你的函数应用以同步触发器。 请参阅有关如何配置此部署技术的操作指南

使用时机:对于在 Linux 消耗定价计划中运行的应用程序而言,当您不希望发生远程生成时,外部包 URL 是唯一支持的部署方法。 在没有 Azure 文件存储的情况下创建应用时,此方法也是推荐的部署技术。 对于在 Linux 上运行的可缩放应用,应转而考虑 Flex 灵活消费计划托管。

应用内容存储位置:你负责将应用内容上传到 Blob 存储。 尽管建议使用 Azure Blob 存储,但你也可使用任何 Blob 存储帐户。

Docker 容器

可以部署在 Linux 容器中运行的函数应用。

如何使用它:在 Linux 容器中创建函数,然后将容器部署到 Azure Functions 或其他容器主机中的高级或专用计划。 使用 Azure Functions Core Tools 为用于生成容器化函数应用的项目创建自定义 Dockerfile。 可以在以下部署中使用容器:

何时使用:在需要更好地控制运行函数应用以及托管容器的 Linux 环境时,请使用 Docker 容器选项。 此部署机制仅适用于在 Linux 上运行的函数。

存储应用内容的位置: 将应用内容作为映像的一部分存储在指定的容器注册表中。

源代码管理

可以在函数应用和源代码存储库之间启用持续集成。 启用源代码管理时,对连接的源存储库中的代码的更新会触发存储库中最新代码的部署。

如何使用它: 从源代码管理设置发布的最简单方法是从门户的 Functions 区域中的部署中心进行发布。

何时使用: 对于协作开发函数应用的团队而言,最佳做法是使用源代码管理。 源代码管理是一种很好的部署选项,可实现更复杂的部署管道。 通常,在暂存槽上启用源代码管理,并且在从代码库验证更新后,切换到生产环境。 有关详细信息,请参阅 Azure Functions 部署插槽

存储应用内容的位置: 源代码管理系统存储应用内容。 应用的文件系统会存储本地克隆并构建的应用内容,可能由在创建函数应用时指定的存储帐户中的 Azure 文件提供支持。

本地 Git

使用本地 Git 通过 Git 将代码从本地计算机推送到 Azure Functions。

如何使用: 请遵照使用本地 Git 部署到 Azure 应用服务中的说明。

何时使用它: 若要减少错误的可能性,请避免使用需要 手动同步触发器的其他步骤的部署方法。 尽可能使用压缩部署

存储应用内容的位置: 应用内容存储在文件系统上,该系统可能由您在创建函数应用时指定的存储帐户中的 Azure 文件存储支持。

FTP/S

可以使用 FTP/S 将文件直接传输到 Azure Functions,但不使用此部署方法。 如果不打算使用 FTP,请禁用它。 如果选择使用 FTP,请强制实施 FTPS。 要了解在 Azure 门户中的操作方法,请参阅强制执行 FTPS

如何使用它: 按照 FTPS 部署设置 中的说明获取可用于使用 FTPS 部署到函数应用的 URL 和凭据。

何时使用它: 若要减少错误的可能性,请避免使用需要 手动同步触发器的其他步骤的部署方法。 尽可能使用压缩部署

存储应用内容的位置: 应用内容存储在文件系统上。 当应用文件系统由默认主机存储帐户中的 Azure 文件支持时,FTP/FTPS 部署会失败。 由于 FTP 限制,使用 Azure 文件存储作为装载的存储时,FTP/FTPS 失败。

门户编辑

在基于门户的编辑器中,可以直接编辑函数应用中的文件(基本上每次保存更改都要进行部署)。

如何使用它: 若要在 Azure 门户中编辑函数,必须在 门户中创建函数。 若要保留单一真实来源,使用任何其他部署方法会使函数变为只读,并阻止在门户中继续编辑。 若要恢复到可在 Azure 门户中编辑文件的状态,可以手动将编辑模式改回 Read/Write,并删除与部署相关的任何应用程序设置(例如 WEBSITE_RUN_FROM_PACKAGE)。

何时使用: 在门户中可以十分方便地开始使用 Azure Functions。 由于 Azure 门户中的开发限制,应使用以下客户端工具之一进行更高级的开发工作:

存储应用内容的位置: 应用内容存储在文件系统上,该系统可能由您在创建函数应用时指定的存储帐户中的 Azure 文件存储支持。

部署行为

将更新部署到函数应用代码时,部署行为取决于托管计划:

消耗、弹性高级版和专用计划: 部署新代码时,当前正在执行的函数将终止。 部署完成后,将加载新代码以开始处理请求。 这种强制终止行为称为重建策略。 对于消耗、弹性高级版和专用计划的近零停机时间部署,请使用 部署槽位。

查看提高 Azure Functions 的性能和可靠性,了解如何编写无状态函数和防御函数。

弹性消耗计划: 默认行为还使用重新创建策略,在部署期间终止当前正在执行的函数。 但是,Flex Consumption 唯一支持两种不同的站点更新策略。 可以配置滚动更新以实现无停机时间的部署。

部署插槽

将函数应用部署到 Azure 时,可以部署到单独的部署槽,而不是直接部署到生产槽。

部署到插槽的方式取决于您使用的具体部署工具。 例如,使用 Azure Functions Core Tools 时,可以使用 --slot 选项来指示 func azure functionapp publish 命令的特定槽名称。

有关部署插槽的详细信息,请参阅 Azure Functions 插槽部署 文档。

后续步骤

请阅读以下文章详细了解如何部署函数应用: