你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

从 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) 文件夹中的本地包文件运行。
<URL> 设置一个 URL,该 URL 是要运行的特定包文件的远程位置。 对于在消耗计划中的 Linux 上运行的功能应用是必需的。

下表指示部署到 WEBSITE_RUN_FROM_PACKAGE 特定操作系统和托管计划的建议值:

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

一般注意事项

  • 包文件必须采用 .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 与 ZipDeploy 中所述。 部署期间会收到错误,例如 ARM-MSDeploy Deploy Failed。 要解决此错误,请将 /MSDeploy 更改为 /ZipDeploy

添加 WEBSITE_RUN_FROM_PACKAGE 设置

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

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

创建 zip 存档

部署的 zip 存档必须包含运行函数应用所需的所有文件。 可以使用内置 .zip 压缩功能或第三方工具,根据 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 进行部署的注意事项

  • 当应用程序包通过 WEBSITE_RUN_FROM_PACKAGE = <URL> 部署到 URL 终结点时,Windows 上运行的函数应用的冷启动时间略有增加。
  • 指定 URL 时,还必须在发布更新的包后手动同步触发器
  • 函数运行时必须具有访问包 URL 的权限。
  • 请勿将包作为公共 Blob 部署到 Azure Blob 存储。 而应使用带有共享访问签名 (SAS) 的专用容器,或者使用托管标识,以便允许 Functions 运行时来访问包。
  • 必须维护用于部署的任何 SAS URL。 当 SAS 过期时,将无法再部署包。 在这种情况下,必须生成新的 SAS 并更新函数应用中的设置。 可以使用托管标识来消除此管理负担。
  • 在高级计划上运行时,请确保消除冷启动
  • 在专用计划上运行时,请确保启用 AlwaysOn
  • 可以使用 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. 向标识授予存储 Blob 数据读取器角色,其范围为包 blob。 有关创建角色分配的详细信息,请参阅分配 Azure 角色以访问 Blob 数据

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