从 Azure 中的包文件运行函数

在 Azure 中,可以直接从函数应用中的部署包文件运行函数。 另一种做法是在函数应用的 c:\home\site\wwwroot (Windows) 或 /home/site/wwwroot (Linux) 目录中部署文件。

本文介绍从包运行函数的好处。 此外,介绍如何在函数应用中启用此功能。

从包文件运行的好处

使用包文件运行函数可提供多种好处:

  • 减少文件副本锁定问题的风险。
  • 可部署到生产应用(需重启)。
  • 验证在应用中运行的文件。
  • 提高 Azure 资源管理器部署的性能。
  • 减少冷启动时间,特别适用于具有大型 npm 包树的 JavaScript 函数。

有关详细信息,请参阅此公告

启用函数从包运行

默认情况下,弹性消耗托管计划上的函数应用从包中运行。 无需执行任何特殊配置。

若要使函数应用能够在消耗弹性高级专用(应用服务)托管计划上从包运行,请向函数应用中添加 WEBSITE_RUN_FROM_PACKAGE 应用设置。 WEBSITE_RUN_FROM_PACKAGE 应用设置可以使用以下值之一:

说明
1 指示函数应用从部署在函数应用的 c:\home\data\SitePackages (Windows) 或 /home/data/SitePackages (Linux) 文件夹中的本地包文件运行。 使用 Azure Functions Core Tools 时,这是默认选项。
<URL> 设置一个 URL,指定要运行的特定包文件所在的远程位置。 在 Linux 系统上以按需计划运行的功能应用程序是必需的。

下表显示了针对特定操作系统和托管方案的部署建议值 WEBSITE_RUN_FROM_PACKAGE

托管计划 Windows Linux
消耗 强烈建议使用 1 仅支持 <URL>
高级 建议使用1 建议使用1
专用 建议使用1 建议使用1

一般注意事项

  • 不要将 WEBSITE_RUN_FROM_PACKAGE 应用设置添加到弹性消耗计划上的应用。
  • 包文件必须采用 .zip 格式。 不支持 TAR 和 GZIP 格式。
  • 建议使用 Zip 部署
  • 将函数应用部署到 Windows 时,应将 WEBSITE_RUN_FROM_PACKAGE 设置为 1 并通过 zip 部署进行发布。
  • 从包运行时,wwwroot 文件夹为只读,如果向此目录写入文件,则会收到错误。 文件在 Azure 门户中也是只读的。
  • 部署包文件的最大大小为 1 GB。
  • 从部署包运行时,不能使用本地缓存。
  • 如果你的项目需要使用远程生成,请不要使用 WEBSITE_RUN_FROM_PACKAGE 应用设置。 请改为添加 SCM_DO_BUILD_DURING_DEPLOYMENT=true 部署自定义应用设置。 对于 Linux,还要添加 ENABLE_ORYX_BUILD=true 设置。 有关详细信息,请参阅远程构建

注意

WEBSITE_RUN_FROM_PACKAGE 应用设置不适用于 MSDeploy,如 MSDeploy VS. ZipDeploy 中所述。 在部署时,您会收到一个错误,例如 ARM-MSDeploy Deploy Failed。 若要解决此错误,请将 /MSDeploy 更改为 /ZipDeploy

添加 WEBSITE_RUN_FROM_PACKAGE 设置

可以通过以下几种方法添加、更新和删除函数应用设置:

如果更改函数应用设置,则需要重启函数应用。

创建 zip 存档

部署的 zip 存档必须包含运行函数应用所需的所有文件。 可以使用内置 .zip 压缩功能或非Microsoft工具从 Functions 项目文件夹的内容手动创建 zip 存档。

存档必须在提取文件夹的根目录中包含 host.json 文件。 函数应用的所选语言堆栈会创建其他要求:

重要

对于生成用于部署的已编译输出的语言,请确保压缩你计划发布的输出文件夹(而不是整个项目文件夹)的内容。 当 Functions 提取 zip 存档的内容时,host.json 文件必须存在于包的根目录中。

使用 WEBSITE_RUN_FROM_PACKAGE = 1

本节提供有关如何从本地包文件运行函数应用的信息。

从现场包进行部署的注意事项

  • 使用本地包是从部署包运行的推荐选项,但在按需计划中托管的 Linux 上运行时除外。
  • 将部署包上载到站点时,推荐方法是 Zip 部署
  • 不使用 Zip 部署时,请确保 c:\home\data\SitePackages (Windows) 或 /home/data/SitePackages (Linux) 文件夹具有名为 packagename.txt 的文件。 此文件仅包含当前正在运行的此文件夹中的包文件的名称,不包含任何空格。

与 zip 部署集成

Zip 部署是 Azure 应用服务的一项功能,可用于将函数应用项目部署到 wwwroot 目录。 项目打包为 .zip 部署文件。 可以使用相同的 API 将包部署到 c:\home\data\SitePackages (Windows) 或 /home/data/SitePackages (Linux) 文件夹。

WEBSITE_RUN_FROM_PACKAGE 应用设置值设为 1 时,zip 部署 API 会将包复制到 c:\home\data\SitePackages (Windows) 或 /home/data/SitePackages (Linux) 文件夹,而不是将文件提取到 c:\home\site\wwwroot (Windows) 或 /home/site/wwwroot (Linux)。 它还会创建 packagename.txt 文件。 在函数应用自动重启后,该包将作为只读文件系统挂载到 wwwroot。 有关 zip 部署的详细信息,请参阅 Azure Functions 的 Zip 部署

注意

进行部署时,将触发函数应用的重启。 当前在部署期间运行的函数执行将终止。 有关如何编写无状态函数和防御函数的信息,请参阅编写无状态函数

使用 WEBSITE_RUN_FROM_PACKAGE = URL

本节提供了关于如何从部署到 URL 端点的包中运行您的函数应用的信息。 此选项是唯一支持从具有消费计划的 Linux 托管包运行的选项。 弹性消耗计划不支持此选项。

从 URL 进行部署的注意事项

  • 请勿在 "Flex Consumption" 计划中的应用里设置 WEBSITE_RUN_FROM_PACKAGE = <URL>。 不支持此选项。
  • 当通过 WEBSITE_RUN_FROM_PACKAGE = <URL> 将应用包部署到 URL 端点时,在 Windows 上运行的函数应用程序的冷启动时间会略有增加。
  • 指定 URL 时,还必须在发布更新的包后手动同步触发器
  • 函数运行时必须具有访问包 URL 的权限。
  • 不应将你的包作为公共 Blob 部署到 Azure Blob 存储。 而应使用带有共享访问签名 (SAS) 的专用容器,或者使用托管标识,以便允许 Functions 运行时来访问包。
  • 必须维护用于部署的任何 SAS URL。 当 SAS 过期时,将无法再部署包。 在这种情况下,必须生成新的 SAS 并更新函数应用中的设置。 可以使用托管标识来消除此管理负担。
  • 在高级计划上运行时,请确保避免冷启动
  • 在专用计划上运行时,请确保启用 Always On
  • 可以使用 Azure 存储资源管理器将包文件上传到存储帐户中的 Blob 容器。

手动将包上传到 Blob 存储

若要在使用 URL 选项时部署压缩包,必须创建一个 .zip 压缩的部署包并将其上传到目标。 以下过程会将内容部署到 Blob 存储中的容器:

  1. 使用所选实用工具为项目创建 .zip 包。

  2. Azure 门户中,搜索存储帐户名称或在存储帐户列表中浏览。

  3. 在存储帐户中的“数据存储”下,选择“容器” 。

  4. 选择“+ 容器”,以在帐户中创建新的 Blob 存储容器。

  5. 在“新建容器”页面中,提供一个“名称”(例如,deployments),确保“匿名访问级别”为“私有”,然后选择“创建”

  6. 选择创建的容器,选择“上传”,浏览到使用项目创建的 .zip 文件的位置,然后选择“上传”

  7. 上传完成后,选择已上传的 blob 文件,并复制 URL。 如果不使用托管标识,则可能需要生成 SAS URL。

  8. 在“函数应用”页中搜索你的函数应用或以浏览方式查找它。

  9. 在函数应用中,展开“设置”,然后选择“环境变量”

  10. 在“应用设置”选项卡中,选择“+ 添加”

  11. 名称中输入值 WEBSITE_RUN_FROM_PACKAGE,并在中粘贴包在 Blob 存储中的 URL。

  12. 选择“应用”,然后选择“应用并确认”以保存设置并重新启动函数应用。

现在,可以在 Azure 中运行函数,验证部署包 .zip 文件是否已成功部署。

使用托管标识从 Azure Blob 存储获取包

可将 Azure Blob 存储配置为使用 Microsoft Entra ID 授权请求。 此配置意味着可以依赖应用程序的托管标识,而不是生成会过期的 SAS 密钥。 默认情况下,将使用应用的系统分配的标识。 如果要指定用户分配的标识,可以将 WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID 应用设置设为该标识的资源 ID。 该设置还可以接受 SystemAssigned 作为值,该值等效于将该设置省略。

若要通过身份来检索包,请执行以下操作:

  1. 确保 Blob 已配置为私有访问

  2. 授予标识Storage Blob Data Reader角色,并将其作用域设定为包 blob。 有关创建角色分配的详细信息,请参阅分配 Azure 角色以访问 Blob 数据

  3. WEBSITE_RUN_FROM_PACKAGE的程序设置设为包的blob URL。 此 URL 通常采用 https://{storage-account-name}.blob.core.chinacloudapi.cn/{container-name}/{path-to-package} 或类似形式。

  4. 如果要指定用户分配的标识,可以将 WEBSITE_RUN_FROM_PACKAGE_BLOB_MI_RESOURCE_ID 应用设置设为该标识的资源 ID。 该设置还可以接受“SystemAssigned”作为值,尽管这与完全省略该设置是一样的。 资源 ID 是 Azure 中资源的标准表示形式。 对于用户分配的托管标识,这将是 /subscriptions/subid/resourcegroups/rg-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name。 可以在“设置”-“属性”->“用户分配的托管标识的 ID”中获取用户分配的托管标识的资源 ID>