你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
可以使用多种不同的技术将Azure Functions项目代码部署到Azure。 本文概述了可用的部署方法,以及在各种方案中使用的最佳方法建议。 它还提供了有关基础部署技术的综合列表和关键详细信息。
部署方法
在 Azure 中将代码发布到你的函数应用所用的部署技术取决于你的特定需求和开发周期中的阶段。 例如,在开发和测试期间,可以直接从开发工具(如Visual Studio Code)进行部署。 当应用处于生产阶段时,你更有可能从源代码管理或使用自动发布管道(其中可能包括验证和测试)持续发布。
下表介绍了代码项目的可用部署方法。
| 部署类型 | 方法 | 最适用于... |
|---|---|---|
| 基于工具 | • Azure CLI • Visual Studio Code publish • Visual Studio publish • Core Tools 发布 |
开发期间的部署和其他临时部署。 使用 本地开发工具按需部署代码。 |
| 托管的应用服务 | • 部署中心 (CI/CD) • 容器部署 |
从源代码管理或从容器注册表进行持续部署 (CI/CD)。 应用服务平台 (Kudu) 管理部署。 |
| 外部管道 | • Azure Pipelines • GitHub Actions |
包括验证、测试和其他操作的生产流水线,这些操作必须作为自动化部署的一部分运行。 该管道管理部署。 |
针对特定方案使用最佳技术。 很多部署方式都基于压缩部署,这是建议的部署方法。
部署技术的可用性
部署方法还取决于运行函数应用的托管计划和操作系统。
目前,Functions 提供 5 个选项用于托管函数应用:
每种计划有不同的行为。 并非所有部署技术都适用于每个托管计划和操作系统。 此图表提供有关支持的部署技术的信息:
| 部署技术 | Flex 消耗 | 消耗 | 弹性高级 | 专属 | 容器应用 |
|---|---|---|---|---|---|
| 一次部署 | ✔ | ||||
| 压缩部署 | ✔ | ✔ | ✔ | ||
| 外部包 URL1 | ✔ | ✔ | ✔ | ||
| Docker 容器 | 仅限 Linux | 仅限 Linux | 仅限 Linux | ✔ | |
| 源代码管理 | 仅限Windows | ✔ | ✔ | ||
| 本地 Git1 | 仅限Windows | ✔ | ✔ | ||
| FTPS1 | 仅限Windows | ✔ | ✔ | ||
| 门户中编辑2 | ✔ | ✔ | ✔ |
1 不建议使用需要手动同步触发器的部署技术。
2 从门户外部将代码部署到函数应用时,将禁用门户内编辑。 有关详细信息(包括门户内编辑的语言支持详细信息),请参阅语言支持详细信息。
关键概念
一些关键概念对于了解部署在Azure Functions的工作方式至关重要。
触发器同步
更改任何触发器时,Functions 基础结构必须意识到这些更改。 对于许多部署技术而言,同步会自动进行。 但在某些情况下,必须手动同步触发器。
使用这些部署选项时,必须始终手动同步触发器:
可以通过以下方式之一手动同步触发器:
在 Azure 门户中重启函数应用。 Functions 主机在应用程序启动后执行后台触发器同步。
使用
az rest命令发送调用syncfunctiontriggersAPI 的 HTTP POST 请求,如以下示例所示:az rest --method post --url https://management.azure.com/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上运行的所有函数应用都有一个小型管理应用,scm站点由 Kudu提供。 此站点处理Azure Functions的大部分部署和生成逻辑。
将应用部署到Windows时,部署过程会运行特定于语言的命令,例如 dotnet restore (C#) 或 npm install (JavaScript)。
在部署期间使用远程生成时,应注意以下事项:
- 消耗计划中运行的函数应用支持远程生成。 但是,这些应用的部署选项受到限制,因为它们没有
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 文件内容共享,但你也可以在其他位置维护包。 Flex 消耗层级应用使用默认存储帐户中的存储容器,除非你配置了用于部署的其他存储帐户。 如需更多信息,请参阅下一部分介绍的每种部署技术的“应用内容存储位置”中的详细信息。
重要说明
存储帐户用于存储重要的应用数据,有时包括应用程序代码本身。 应限制其他应用和用户对存储帐户的访问。
受保护的虚拟网络
如果函数应用启用了 专用终结点 并且禁用了公用网络访问, scm 则无法公开访问 (Kudu) 部署站点。 当函数应用使用的存储帐户也受到专用终结点保护时,必须访问存储的技术也会受到类似的阻止。 由于这些限制,本文中所述的部署技术无法从虚拟网络外部访问完全受网络保护的函数应用。
若要将代码部署到受网络保护的函数应用,部署工具必须连接到虚拟网络。 可以通过以下方式实现此连接:
- 如果从 Azure 管道进行部署,请使用具有虚拟网络访问权限的 自承载代理,或使用网络配置 托管 DevOps 代理池。
- 如果从GitHub工作流进行部署,请使用自承载运行程序访问虚拟网络,或在Azure虚拟网络中配置 GitHub 托管的运行程序。
- 使用 点到站点 VPN 或 ExpressRoute 将开发计算机连接到虚拟网络。
有关在虚拟网络中配置函数应用的详细信息,请参阅 如何使用虚拟网络配置Azure Functions。
部署技术详细信息
Azure Functions中提供了以下部署方法。 若要确定每个托管计划支持哪些技术,请参阅 部署技术可用性 表。
一次部署
One deploy 是 Flex 消耗计划中应用支持的唯一部署技术。 最终得到的是运行函数应用的现成 .zip 包。
如何使用:使用Visual Studio Code的发布功能进行部署,或通过命令行使用Azure Functions Core Tools或Azure CLI进行部署。 我们的Azure Dev Ops Task和GitHub Action在检测到一个 Flex Consumption 应用正在部署时,会同样使用一次性部署。
创建 Flex Consumption 应用时,必须指定部署存储(blob)容器以及身份验证方法。 默认情况下,会使用与
AzureWebJobsStorage连接相同的存储帐户,并通过连接字符串作为身份验证方法。 因此,部署设置是在应用创建期间配置的,无需应用程序设置。
使用方法:One deploy 是 Flex 消耗计划上运行的函数应用唯一可用的部署技术。
应用内容存储位置:创建 Flex 消耗函数应用时,指定部署存储容器。 此 Blob 容器是工具上传部署的应用内容的位置。 若要更改位置,可以在Azure门户中访问“部署设置”边栏选项卡,或使用 Azure CLI。
小窍门
Azure 门户中提供了 Flex Consumption Deployment 诊断工具。 打开您的 Flex Consumption 应用,选择诊断并解决问题,接着搜索Flex Consumption Deployment。 此工具显示有关部署的详细信息,包括部署历史记录、包状态和故障排除建议。
压缩部署
Zip deploy 是消耗计划、弹性高级计划和应用服务(专用)计划中函数应用的默认部署技术,也是推荐的部署技术。 最终得到的是运行函数应用的现成 .zip 包。 它不同于 外部包 URL ,即平台负责远程生成和存储应用内容。
如何使用: 通过你喜欢的客户端工具进行部署,包括 Visual Studio Code、Visual Studio,或通过命令行使用 Azure Functions Core Tools 或 Azure CLI。 我们的 Azure Dev Ops Task 和 GitHub Action同样利用 zip 部署。
使用压缩部署方法时,可将应用设置为从包运行。 若要从包运行,请将
WEBSITE_RUN_FROM_PACKAGE应用程序设置值设置为1。 建议使用压缩部署。 它能够提升应用程序的加载速度,并且是 VS Code、Visual Studio 和 Azure CLI 的默认设置。
使用时间:Zip 部署是 Windows 消费、Windows 和 Linux 弹性高级计划以及 Windows 和 Linux 应用服务(专用)计划中函数应用的默认和建议部署技术。
应用内容的存储位置: 默认情况下,zip 部署中的应用内容存储在文件系统上,Azure 可能会使用您在创建函数应用时指定的存储帐户中的 Azure 文件存储 来支持此存储。 在 Linux 消耗层级中,应用内容改为持久化在由
AzureWebJobsStorage应用设置指定的存储帐户中的 Blob 上,且应用设置WEBSITE_RUN_FROM_PACKAGE的值为该 Blob 的 URL。
外部包 URL
如果要手动控制部署的执行方式,则外部包 URL 是一个选项。 你负责将包含生成的应用内容的现成 .zip 包上传到 Blob 存储,并将此外部 URL 作为函数应用上的应用程序设置引用。 每当应用重启时,它会提取包、装载包并在从包运行模式下运行。
如何使用:将 添加到应用程序设置
WEBSITE_RUN_FROM_PACKAGE。 此设置的值应是一个 Blob URL,它指向你希望应用运行的特定包的位置。 可以在门户中添加设置,或使用 Azure CLI 添加设置。如果使用Azure Blob 存储,则 Function App 可以使用基于托管标识的连接或共享访问签名(SAS)来访问容器。 选择的选项会影响你用作
WEBSITE_RUN_FROM_PACKAGE值的 URL 类型。 建议使用托管标识实现整体安全性,并且因为 SAS 令牌过期,必须手动维护。每当部署函数应用引用的包文件时,都需要手动同步触发器,包括进行初始部署时。 如果你更改包文件的内容但不更改 URL 本身,还必须重启你的函数应用以同步触发器。 请参阅有关如何配置此部署技术的操作指南。
使用方法:对于不希望进行远程生成时在 Linux 消耗计划上运行的应用,外部包 URL 是唯一支持的部署方法。 在不使用 Azure 文件存储的情况下创建应用时,此方法也是推荐的部署技术。 对于在 Linux 上运行的可缩放应用,应转而考虑 Flex 消耗计划托管。
应用内容存储位置:你负责将应用内容上传到 Blob 存储。 您可以使用任何 blob 存储帐户,但推荐使用 Azure Blob 存储。
Docker 容器
可以部署在 Linux 容器中运行的函数应用。
如何使用它:在 Linux 容器中创建函数然后将容器部署到Azure Functions或其他容器主机中的高级或专用计划。 使用 Azure Functions Core Tools为用于生成容器化函数应用的项目创建自定义 Dockerfile。 可以在以下部署中使用容器:
- 将其部署到您在Azure门户中创建的Azure Functions资源。 有关详细信息,请参阅使用容器创建的 Azure 门户。
- 将资源部署到您从命令行创建的 Azure Functions。 需要高级计划或专用(应用服务)计划。 若要了解如何操作,请参阅 创建第一个容器化Azure Functions。
- 部署到Azure容器应用。 若要了解操作方法,请参阅 在 Azure 容器应用中创建第一个容器化的 Azure 函数。
- 部署到 Kubernetes 群集。 可以使用 Azure Functions Core Tools 部署到群集。 使用
func kubernetes deploy命令。
何时使用:在需要更好地控制运行函数应用以及托管容器的 Linux 环境时,请使用 Docker 容器选项。 此部署机制仅适用于在 Linux 上运行的函数。
存储应用内容的位置: 将应用内容作为映像的一部分存储在指定的容器注册表中。
源代码管理
可以在函数应用和源代码存储库之间启用持续集成。 启用源代码管理时,对连接的源存储库中的代码的更新会触发存储库中最新代码的部署。 有关详细信息,请参阅 适用于 Azure Functions 的连续部署。
如何使用它: 从源代码管理设置发布的最简单方法是从门户的 Functions 区域中的部署中心进行发布。 有关详细信息,请参阅 Azure 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 无法将 Azure 文件存储 挂载为存储,因为 FTP 限制。
门户编辑
在基于门户的编辑器中,可以直接编辑函数应用中的文件(基本上每次保存更改都要进行部署)。
如何使用 it: 若要在 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 部署槽位文档。
后续步骤
请阅读以下文章详细了解如何部署函数应用:
- Azure Functions 的连续部署
- 使用 Azure Pipelines 进行持续交付
- ```zh-CN 适用于 Azure Functions 的 Zip 部署 ```
- 从包文件运行Azure Functions
- 在 Azure Functions 中为您的函数应用实现资源部署自动化
- 在 Flex Consumption 中配置零停机时间部署