Azure Functions中的部署技术

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

部署方法

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

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

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

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

部署技术的可用性

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

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

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

| 部署技术 | 消耗 | 弹性高级版 | 专用 | 容器应用 | |-----------------------|::-------------------------:|:------------------:|:---------------------------:|:-------------:| | One deploy | | | | | | 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 部署更新版本的部署包时,都必须手动重启函数应用。
  • 在消耗计划或弹性高级计划中运行的应用程序中,您还必须在以下情况下手动同步触发器:
    • 使用 ARM 模板、Bicep 或 Terraform 文件进行基于资源管理器的部署时,可以使用外部包 URL。
    • 使用相同的外部包 URL 原地更新部署软件包时。
  • 向现有函数应用添加网络限制时,必须保证连接到应用设置中 AzureWebJobsStorage 设置的默认主机存储帐户。 有关详细信息,请参阅 如何在 Azure Functions 中使用安全存储帐户。

远程生成

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

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

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

在Windows上运行的所有函数应用都有一个小型管理应用,scm站点由 Kudu提供。 此站点处理Azure Functions的大部分部署和生成逻辑。

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

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

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

应用内容存储

基于包的部署方法将包存储在与 AzureWebJobsStorage 设置定义的函数应用关联的存储帐户中。 当可用时,消耗和弹性高级计划应用会尝试使用此帐户中的Azure 文件存储内容共享,但你也可以在另一个位置维护包。 如需更多信息,请参阅下一部分介绍的每种部署技术的“应用内容存储位置”中的详细信息。

重要

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

受保护的虚拟网络

如果函数应用启用了 专用终结点 并且禁用了公用网络访问, scm 则无法公开访问 (Kudu) 部署站点。 当函数应用使用的存储帐户也受到专用终结点保护时,必须访问存储的技术也会受到类似的阻止。 由于这些限制,本文中所述的部署技术无法从虚拟网络外部访问完全受网络保护的函数应用。

若要将代码部署到受网络保护的函数应用,部署工具必须连接到虚拟网络。 可以通过以下方式实现此连接:

有关在虚拟网络中配置函数应用的详细信息,请参阅 如何使用虚拟网络配置Azure Functions。

部署技术详细信息

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

Zip 部署

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

如何使用您喜爱的客户端工具进行部署:可以使用 Visual Studio Code,Visual Studio,或者通过命令行使用 Azure Functions Core Tools 或 Azure CLI 来部署。 我们的 GitHub Action同样利用 zip 部署。

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

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

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

外部软件包 URL

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

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

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

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

使用时机:对于在 Linux 消耗定价计划中运行的应用程序而言,当您不希望发生远程生成时,外部包 URL 是唯一支持的部署方法。 在不使用 Azure 文件的情况下创建应用时,此方法也是推荐的部署技术。

应用内容存储位置:你负责将应用内容上传到 Blob 存储。 您可以使用任何 blob 存储帐户,不过建议使用 Azure Blob 存储。

Docker 容器

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

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

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

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

源代码管理

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

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

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

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

本地 Git

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

如何使用它: 按照 Local Git 部署到 Azure 应用服务 中的说明操作。

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

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

FTP/S

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

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

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

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

门户编辑

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

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

何时使用: 门户是入门Azure Functions的好途径。 由于 Azure 门户中开发限制,因此应使用以下客户端工具之一进行更高级的开发工作:

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

部署行为

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

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

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

部署插槽

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

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

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

后续步骤

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