Azure Functions 中的部署技术

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

部署方法

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

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

部署类型 方法 最适用于...
基于工具 • Visual Studio Code 发布
• Visual Studio 发布
• 核心工具发布
开发期间的部署和其他临时部署。 部署由工具在本地进行管理。
托管的应用服务 • 部署 中心 (CI/CD)
• 容器 部署
从源代码管理或从容器注册表进行持续部署 (CI/CD)。 部署由应用服务平台 (Kudu) 进行管理。
外部管道 • GitHub 操作 生产和 DevOps 管道,包含其他验证、测试和作为自动部署的一部分运行的其他操作。 部署由管道进行管理。

虽然特定的 Functions 部署使用基于其上下文的最佳技术,但大多数部署方法都基于 zip 部署

部署技术的可用性

Azure Functions 支持跨平台的本地开发以及使用 Windows 和 Linux 作为托管位置。 目前,可以使用三种托管计划:

每种计划有不同的行为。 并非所有部署技术都适用于每种风格的 Azure Functions。 以下图表显示了哪些部署技术适用于操作系统和托管计划的每种组合:

部署技术 Windows 消耗计划 Windows 高级计划 Windows 专用计划 Linux 消耗计划 Linux 高级计划 Linux 专用计划
外部包 URL1
压缩部署
Docker 容器
Web 部署
源代码管理
本地 Git1
云同步1
FTP1
门户编辑 2 2

1 需要手动触发器同步的部署技术。 2 仅对使用高级和专用计划的 Linux 上的 Functions 的 HTTP 和计时器触发器启用门户编辑。

关键概念

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

触发器同步

更改任何触发器时,Functions 基础结构必须意识到这些更改。 对于许多部署技术而言,同步会自动进行。 但在某些情况下,必须手动同步触发器。 通过引用外部包 URL、本地 Git、云同步或 FTP 部署更新时,必须手动同步触发器。 可通过以下三种方式之一来同步触发器:

  • 在 Azure 门户中重启函数应用
  • 使用主密钥将 HTTP POST 请求发送到 https://{functionappname}.chinacloudsites.cn/admin/host/synctriggers?code=<API_KEY>
  • 将 HTTP POST 请求发送到 https://management.chinacloudapi.cn/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.Web/sites/<FUNCTION_APP_NAME>/syncfunctiontriggers?api-version=2016-08-01。 请将占位符替换为你的订阅 ID、资源组名称和函数应用名称。

远程生成

Azure Functions 可以自动在它在压缩部署后接收的代码上执行生成操作。 这些生成的行为存在轻微差异,具体取决于应用是在 Windows 上还是在 Linux 上运行。 如果此前已将应用设置为在从包运行模式下运行,则不会执行远程生成。 若要了解如何使用远程生成,请导航到 zip 部署

备注

如果存在远程生成问题,可能是因为应用是在该功能发布日期(2019 年 8 月 1 日)之前创建的。 尝试创建新的函数应用,或运行 az functionapp update -g <RESOURCE_GROUP_NAME> -n <APP_NAME> 更新函数应用。 此命令可能需要尝试两次才能成功。

Windows 上的远程生成

在 Windows 上运行的所有函数应用都有一个小的管理应用,即 SCM(或 Kudu)站点。 该站点会处理 Azure Functions 的很多部署和生成逻辑。

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

Linux 上的远程生成

若要在 Linux 上启用远程生成,必须设置以下应用程序设置

  • ENABLE_ORYX_BUILD=true
  • SCM_DO_BUILD_DURING_DEPLOYMENT=true

默认情况下,Azure Functions Core Tools适用于 Visual Studio Code 的 Azure Functions 扩展在部署到 Linux 时执行远程生成。 因此,这两种工具在 Azure 中自动创建这些设置。

在 Linux 上以远程方式生成应用时,应用从部署包运行

消耗计划

在消耗计划中运行的 Linux 函数应用没有 SCM/Kudu 站点,这限制了部署选项。 但是,在消耗计划中运行的 Linux 上的函数应用支持远程生成。

专用和高级计划

专用(应用服务)计划高级计划中的 Linux 上运行的函数应用也具有受限的 SCM/Kudu 站点。

部署技术详细信息

Azure Functions 中提供了以下部署方法。

外部包 URL

可以使用外部包 URL 来引用包含函数应用的远程包 (.zip) 文件。 可从提供的 URL 下载该文件,应用将在“从包运行”模式下运行。

如何使用:将 WEBSITE_RUN_FROM_PACKAGE 添加到应用程序设置。 此设置的值应是一个 URL(要运行的特定包文件的位置)。 可以在门户中使用 Azure CLI 来添加设置。

如果使用 Azure Blob 存储,请结合共享访问签名 (SAS) 使用专用容器,使 Functions 能够访问该包。 每当应用程序重启时,都会提取内容的副本。 引用必须在应用程序的整个生存期内有效。

何时使用: 如果用户不希望进行 远程生成,则对于消耗计划中的在 Linux 上运行的 Azure Functions,外部包 URL 是唯一受支持的部署方法。 更新函数应用引用的包文件时,必须手动同步触发器,以告知 Azure 你的应用程序已更改。

压缩部署

使用压缩部署可将包含函数应用的 .zip 文件推送到 Azure。 可以选择将应用设置为开始从包运行,或者指定进行远程生成

如何使用: 使用偏爱的客户端工具进行部署:Visual Studio CodeVisual Studio,或从命令行使用 Azure Functions Core Tools。 默认情况下,这些工具使用 zip 部署并从包运行。 Core Tools 和 Visual Studio Code 扩展在部署到 Linux 时都启用远程生成。 若要手动将 .zip 文件部署到函数应用,请遵照从 .zip 文件或 URL 进行部署中的说明操作。

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

何时使用: 压缩部署是建议用于 Azure Functions 的部署技术。

Docker 容器

可以部署包含函数应用的 Linux 容器映像。

如何使用: 在高级或专用计划中创建一个 Linux 函数应用,并指定要从哪个容器映像运行。 可通过两种方式实现此目的:

  • 在 Azure 门户上的 Azure 应用服务计划中创建一个 Linux 函数应用。 对于“发布”,请选择“Docker 映像”,然后配置容器。 输入映像所在的位置。
  • 使用 Azure CLI 在应用服务计划中创建一个 Linux 函数应用。 若要了解如何操作,请参阅使用自定义映像在 Linux 上创建函数

若要使用自定义容器部署到现有应用,请在 Azure Functions Core Tools 中使用 func deploy 命令。

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

Web 部署 (MSDeploy)

Web 部署可打包 Windows 应用程序(包括 Azure 中的 Windows 上运行的函数应用)并将其部署到任何 IIS 服务器。

如何使用: 使用 Visual Studio Tools for Azure Functions。 清除“从包文件运行(建议)”复选框。

还可以下载 Web 部署 3.6 并直接调用 MSDeploy.exe

何时使用: 可以顺利地支持 Web 部署,但是,首选机制是 在启用“从包运行”的情况下使用压缩部署。 有关详细信息,请参阅 Visual Studio开发指南

源代码管理

使用源代码管理将函数应用连接到 Git 存储库。 更新该存储库中的代码会触发部署。 有关详细信息,请参阅 Kudu Wiki

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

何时使用: 对于协作开发函数应用的团队而言,最佳做法是使用源代码管理。 源代码管理是一种很好的部署选项,可实现更复杂的部署管道。

本地 Git

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

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

何时使用: 一般而言,我们建议使用其他部署方法。 从本地 Git 发布时,必须手动同步触发器

云同步

使用云同步可将 Dropbox 和 OneDrive 中的内容同步到 Azure Functions。

何时使用: 一般而言,我们建议使用其他部署方法。 使用云同步发布时,必须手动同步触发器

FTP

可以使用 FTP 将文件直接传输到 Azure Functions。

如何使用: 请遵照 使用 FTP/s 部署内容中的说明。

何时使用: 一般而言,我们建议使用其他部署方法。 使用 FTP 发布时,必须手动同步触发器

门户编辑

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

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

何时使用: 在门户中可以十分方便地开始使用 Azure Functions。 对于更密集的开发工作,我们建议使用以下客户端工具之一:

下表显示了支持门户编辑的操作系统和语言:

Language Windows 消耗计划 Windows 高级计划 Windows 专用计划 Linux 消耗计划 Linux 高级计划 Linux 专用计划
C#
C# 脚本 * *
F#
Java
JavaScript (Node.js) * *
Python(预览版)
PowerShell(预览版)
TypeScript (Node.js)

* 仅对使用高级和专用计划的 Linux 上的 Functions 的 HTTP 和计时器触发器启用门户编辑。

部署行为

在进行部署时,允许所有现有执行完成或超时,然后加载新代码以开始处理请求。

如果需要对此转换进行更多控制,则应使用部署槽。

部署槽

将函数应用部署到 Azure 时,可以部署到单独的部署槽,而不是直接部署到生产槽。 有关部署槽的详细信息,请参阅 Azure Functions 部署槽文档。

后续步骤

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