可以使用多种不同的技术将Azure Functions项目代码部署到Azure。 本文概述了可用的部署方法,以及在各种方案中使用的最佳方法建议。 它还提供了有关基础部署技术的综合列表和关键详细信息。
部署方法
用于在Azure中将代码发布到函数应用的部署技术取决于你在开发周期中的具体需求和阶段。 例如,在开发和测试期间,可以直接从开发工具(如Visual Studio Code)进行部署。 当应用处于生产阶段时,你更有可能从源代码管理或使用自动发布管道(其中可能包括验证和测试)持续发布。
下表介绍了代码项目的可用部署方法。
| 部署类型 | 方法 | 最适用于... |
|---|---|---|
| 基于工具 |
Azure CLI Visual Studio Code 发布 Visual Studio 发布 核心工具发布 |
开发期间的部署和其他临时部署。 使用 本地开发工具按需部署代码。 |
| 平台管理 | 部署中心(CI/CD) 容器部署 |
从源代码管理或容器注册表进行持续部署 (CI/CD)。 托管平台负责管理部署。 |
| 外部管道 | GitHub 活动 | 包括验证、测试和其他操作的生产流水线,这些操作必须作为自动化部署的一部分运行。 管道管理部署。 |
针对特定方案使用最佳技术。 对于受支持的托管计划,许多部署方法都使用 ZIP 部署。
部署技术的可用性
部署方法还取决于运行函数应用的托管计划和操作系统。
目前,Functions 提供 5 个选项用于托管函数应用:
- 弹性高级计划
- 专用(应用服务)计划
- 消耗计划 (旧版)
每种计划有不同的行为。 并非所有部署技术都适用于每个托管计划和操作系统。 此图表提供有关支持的部署技术的信息:
| 部署技术 | 消耗 | 弹性高级版 | 专属 | 容器应用 |
|---|---|---|---|---|
| ZIP 包部署 | Supported | Supported | Supported | 不支持 |
| 外部包 URL1 | Supported | Supported | Supported | 不支持 |
| 容器镜像(Docker) | 仅限 Linux | 仅限 Linux | 仅限 Linux | Supported |
| 源代码管理 | 仅限Windows | Supported | Supported | 不支持 |
| 本地 Git1 | 仅限Windows | Supported | Supported | 不支持 |
| FTPS1 | 仅限Windows | Supported | Supported | 不支持 |
| 门户内编辑2 | Supported | Supported | Supported | 不支持 |
- 不推荐使用需要手动同步触发器的部署技术。
- 当代码从门户外部部署到函数应用时,门户内编辑会被禁用。 有关详细信息(包括门户内编辑的语言支持详细信息),请参阅语言支持详细信息。
请在本文顶部选择您的托管计划,查看适用于您的功能应用的部署技术和行为。
关键概念
一些关键概念对于了解部署在Azure Functions的工作方式至关重要。
按托管计划进行应用内容存储
部署应用内容的位置取决于托管计划和部署技术:
| 托管计划 | 应用内容存储 |
|---|---|
| 消耗、弹性溢价和专用 | 应用文件系统、Azure 文件存储 内容共享目录或外部程序包 URL,具体取决于部署技术。 |
触发器同步
当部署添加、删除或更改函数或其触发配置时,函数基础设施必须更新函数应用的触发元数据。 这种同步对许多部署技术都是自动发生的。 但在某些情况下,必须手动同步触发器。
使用这些部署选项时,必须始终手动同步触发器:
可以通过以下方式之一手动同步触发器:
在 Azure 门户中重新启动函数应用程序。 Functions 主机在应用程序启动后执行后台触发器同步。
使用
az rest命令发送调用syncfunctiontriggersAPI 的 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 上运行的功能应用都有配套部署网站。 此站点处理Azure Functions的大部分部署和生成逻辑。
将应用部署到Windows时,部署过程会运行特定于语言的命令,例如 dotnet restore (C#) 或 npm install (JavaScript)。
在部署期间使用远程生成时,应注意以下事项:
- 在消耗计划中运行在 Linux 上的函数应用程序支持远程构建。 然而,这些应用的部署选项有限,因为它们没有配套的部署站点。
- 在 Linux 上运行的 Elastic Premium 计划或专用(应用服务)计划的功能应用确实有一个配套部署站点,但相比 Windows 比较有限。
- 请求远程构建时,不要设置
WEBSITE_RUN_FROM_PACKAGE。 对于采用 Linux 消耗计划、弹性高级计划和专用计划的应用,应改为使用 Linux 选项卡中所述的部署设置来启用远程构建。部署过程可以打包构建输出,并将应用配置为从该包运行。 - 在功能可用之前(2019 年 8 月 1 日)创建应用时,可能会遇到远程生成问题。 对于较旧的应用,请创建新的函数应用或运行
az functionapp update --resource-group <RESOURCE_GROUP_NAME> --name <APP_NAME>以更新函数应用。 此命令可能需要尝试两次才能成功。
应用内容存储
根据部署技术的不同,您的应用内容可以存储在应用文件系统、Azure 文件存储 内容共享,或外部包 URL 中。 回顾下一节:每种部署技术的 应用内容存储位置 。
重要
存储帐户用于存储重要的应用数据,有时包括应用程序代码本身。 应限制其他应用和用户对存储帐户的访问。
受保护的虚拟网络
当函数应用启用 了私有端点 且禁用了公共网络访问时,部署端点就无法公开访问。 推送部署工具,包括Core Tools、Visual Studio Code、Azure CLI、GitHub Actions和Azure Pipelines,会向该端点发送包。 执行部署的机器、运行者或代理必须同时具备网络连接和私有部署端点的DNS解析。
您可以通过以下方式提供这种连接:
- 对于Azure Pipelines,可以在连接网络中使用自托管代理,或配置带网络功能的托管DevOps代理池。
- 对于 GitHub Actions,可以在连接网络中使用自托管运行器,或配置一个带有 Azure 私有网络的 GitHub 托管运行器。
- 通过使用点到站点 VPN、站点到站点 VPN 或ExpressRoute连接开发计算机。
部署资源可以位于同一虚拟网络中,也可以位于与私有端点有路由和 DNS 连接的网络中,例如对等虚拟网络。
基于 资源管理器 的包部署不会将包从发起客户端推送到部署端点。 相反,部署服务会从部署资源中提供的 URL 获取程序包。 包的URL和部署存储必须对部署服务开放。
有关在虚拟网络中配置函数应用的详细信息,请参阅 如何使用虚拟网络配置Azure Functions。
不同托管计划下的部署行为
以下部署方法适用于您选择的托管计划。 要比较所有计划中的技术,请参阅 部署技术可用性 表。
ZIP 包部署
ZIP 部署是 Consumption 计划、Elastic Premium 和专用(App Service)计划中功能应用的默认且推荐的部署技术。 最终的结果是一个可以立即运行的 .zip 包,您的函数应用程序运行在其上。 它不同于 外部包 URL ,即平台负责远程生成和存储应用内容。
如何使用:通过您偏好的客户端工具:Visual Studio Code、Visual Studio,或通过命令行使用 Azure Functions Core Tools 或 Azure CLI 部署。 GitHub Action同样使用 ZIP 部署。
使用ZIP部署时,你可以设置应用 从包中运行。 若要从包运行,请将
WEBSITE_RUN_FROM_PACKAGE应用程序设置值设置为1。 我们建议使用ZIP部署。 它能加快你的应用加载速度,并且是 Visual Studio Code、Visual Studio 和 Azure CLI 的默认配置。
何时使用:ZIP 部署是 Windows Consumption、Windows 和 Linux Elastic Premium 以及 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 本身,还必须重启你的函数应用以同步触发器。 关于配置步骤,请参见 “从外部包 URL 运行”。
使用时机:对于在 Linux 消耗定价计划中运行的应用程序而言,当您不希望发生远程生成时,外部包 URL 是唯一支持的部署方法。 在不使用 Azure 文件的情况下创建应用时,此方法也是推荐的部署技术。
应用内容存储位置:你负责将应用内容上传到 Blob 存储。 你可以使用任何 blob 存储账户,不过推荐使用 Azure Blob 存储。
Docker 容器
可以部署在 Linux 容器中运行的函数应用。
如何使用它:在 Linux 容器中创建函数然后将容器部署到Azure Functions或其他容器主机中的高级或专用计划。 使用 Azure Functions Core Tools为用于生成容器化函数应用的项目创建自定义 Dockerfile。 可以在以下部署中使用容器:
- 部署到您在 Azure 门户中创建的这些 Azure Functions 资源。 有关更多信息,请参阅在 Azure 门户中使用容器创建。
- 从命令行创建的 Azure Functions 资源进行部署。 需要高级计划或专用(应用服务)计划。 若要了解如何操作,请参阅 创建第一个容器化Azure Functions。
- 部署到 Kubernetes 群集。 可以使用 Azure Functions Core Tools 部署到群集。 使用
func kubernetes deploy命令。
何时使用:在需要更好地控制运行函数应用以及托管容器的 Linux 环境时,请使用 Docker 容器选项。 此部署机制仅适用于在 Linux 上运行的函数。
存储应用内容的位置: 将应用内容作为映像的一部分存储在指定的容器注册表中。
源代码管理
可以在函数应用和源代码存储库之间启用持续集成。 启用源代码管理时,对连接的源存储库中的代码的更新会触发存储库中最新代码的部署。
如何使用它: 从源代码管理设置发布的最简单方法是从门户的 Functions 区域中的部署中心进行发布。
何时使用: 对于协作开发函数应用的团队而言,最佳做法是使用源代码管理。 源代码管理是一种很好的部署选项,可实现更复杂的部署管道。 通常,在暂存槽上启用源代码管理,并且在从代码库验证更新后,切换到生产环境。 有关详细信息,请参阅 Azure Functions 部署槽位。
存储应用内容的位置: 源代码管理系统存储应用内容。 应用文件系统存储本地克隆和构建的应用内容结构,其中创建函数应用时指定的存储帐户可能由 Azure 文件存储 提供支持。
本地 Git
使用本地 Git 将代码从本地计算机推送到 Azure Functions。
如何使用它: 按照 Local Git 部署到 Azure 应用服务 中的说明操作。
应用内容存储位置: 文件系统存储应用内容。 文件系统可能由你创建函数应用时指定的存储账户中的 Azure 文件存储 支持。
FTPS
你可以用FTPS直接把文件传到Azure Functions,但不要用这种部署方式。 当你不打算用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 部署槽位文档。
后续步骤
请阅读以下文章详细了解如何部署函数应用: