Azure Functions 的存储注意事项

创建函数应用实例时,Azure Functions 需要 Azure 存储帐户。 函数应用可以使用以下存储服务:

存储服务 函数用法
Azure Blob 存储 维护绑定状态和函数密钥。
还由 Durable Functions 中的任务中心使用。
Azure 文件 文件共享,用于存储和运行消耗计划高级计划中的函数应用代码。
默认已设置 Azure 文件存储,但在某些情况下,你可以创建不使用 Azure 文件存储的应用
Azure 队列存储 Durable Functions 中的任务中心使用。
Azure 表存储 Durable Functions 中的任务中心使用。

重要

使用消耗/高级托管计划时,函数代码和绑定配置文件存储在主存储帐户的 Azure 文件存储中。 删除主存储帐户时,此内容将随之删除且无法恢复。

存储帐户要求

创建函数应用时,必须创建或链接到支持 Blob、队列和表存储的常规用途的 Azure 存储帐户。 这是因为 Functions 依赖于 Azure 存储,执行管理触发器和记录函数执行等操作。 某些存储帐户不支持队列和表。 这些帐户包括仅 Blob 存储帐户和 Azure 高级存储。

若要了解有关存储帐户类型的详细信息,请参阅 Azure 存储服务简介

虽然可以将现有存储帐户用于函数应用,不过必须确保它满足这些要求。 可以保证通过 Azure 门户在函数应用创建流中创建的存储帐户满足这些存储帐户要求。 通过门户在创建函数应用的过程中选择现有存储帐户时,会筛选掉不受支持的帐户。 在此流中,只允许选择要创建的函数应用所在区域中的现有存储帐户。 若要了解详细信息,请参阅存储帐户位置

存储帐户指导

每个 Function App 都需要存储帐户才能运行。 如果该帐户已删除,则你的函数应用将不会运行。 若要对存储相关问题进行故障排除,请参阅如何对存储相关问题进行故障排除。 以下附加注意事项适用于函数应用使用的存储帐户。

存储帐户位置

为了获得最佳性能,函数应用应使用同一区域中的存储帐户,从而减少延迟。 Azure 门户强制实施此最佳做法。 如果出于某种原因,需要使用不同于函数应用所在区域的区域中的存储帐户,则必须在门户外创建函数应用。

存储帐户连接设置

存储帐户连接在 AzureWebJobsStorage 应用程序设置中进行维护。

重新生成存储密钥时,必须更新存储帐户连接字符串。 在此处阅读有关存储密钥管理的详细信息

共享存储帐户

多个函数应用可以共享同一个存储帐户,而不会出现任何问题。 例如,在 Visual Studio 中,可以使用 Azure 存储仿真器开发多个应用。 在这种情况下,仿真器的作用类似于单个存储帐户。 函数应用使用的同一个存储帐户也可用于存储应用程序数据。 但是在生产环境中,这种方法并不总是个好主意。

生命周期管理策略注意事项

Functions 使用 Blob 存储来保存重要信息,例如函数访问密钥。 将某个生命周期管理策略应用于 Blob 存储帐户时,该策略可能会删除 Functions 主机所需的 Blob。 因此,不应将此类策略应用于 Functions 使用的存储帐户。 如果确实需要应用此类策略,请记得排除 Functions 使用的容器,这些容器通常以 azure-webjobsscm 为前缀。

优化存储性能

若要最大程度地提高性能,请对每个函数应用使用单独的存储帐户。 如果有 Durable Functions 或事件中心触发的函数,则请注意,这两种函数都会产生大量存储事务,这一点特别重要。 当应用程序逻辑与 Azure 存储交互时,无论是直接(使用存储 SDK)交互还是通过某个存储绑定进行交互,都应使用专用存储帐户。 例如,如果有一个事件中心触发的函数将一些数据写入 Blob 存储,请使用两个存储帐户 - 一个帐户用于函数应用,另一个帐户用于函数存储的 Blob。

存储数据加密

Azure 存储可对存储帐户中的所有数据进行静态加密。 有关详细信息,请参阅静态数据的 Azure 存储加密

默认情况下,数据使用 Microsoft 管理的密钥进行加密。 为了进一步控制加密密钥,可以提供客户管理的密钥,用于对 blob 和文件数据进行加密。 这些密钥必须存在于 Azure Key Vault 中,以便 Functions 能够访问存储帐户。 若要了解详细信息,请参阅使用客户管理的密钥进行静态加密

区域内数据驻留

当必须将所有客户数据保留在单个区域内时,与函数应用关联的存储帐户必须是具有区域内冗余的存储帐户。 区域内冗余存储帐户还必须与 Azure Durable Functions 一起使用。

其他由平台管理的客户数据只有托管在内部负载均衡的应用服务环境(简称 ASE)中时才会存储在该区域内。

创建不使用 Azure 文件存储的应用

对于高级计划和非 Linux 消耗计划,默认已设置 Azure 文件存储作为大规模方案中的共享文件系统。 该文件系统供平台用来实现某些功能(例如日志流式处理),但它的主要用途是确保已部署的函数有效负载的一致性。 使用外部包 URL 部署应用时,应用内容将从单独的只读文件系统提供,因此可以按需忽略 Azure 文件存储。 在这种情况下,将提供可写文件系统,但不保证该文件系统与所有函数应用实例共享。

如果不使用 Azure 文件存储,则必须考虑以下要求:

  • 必须从外部包 URL 进行部署。
  • 应用不能依赖于共享的可写入文件系统。
  • 应用不能使用 Functions 运行时 v1。
  • 客户端(例如 Azure 门户)中的日志流式处理体验默认使用文件系统日志。 你应该改为依赖 Application Insights 日志。

如果正确考虑到了上述要求,则可以创建不使用 Azure 文件存储的应用。 在不指定 WEBSITE_CONTENTAZUREFILECONNECTIONSTRINGWEBSITE_CONTENTSHARE 应用程序设置的情况下创建函数应用。 可以通过为标准部署生成 ARM 模板、删除这两个设置,然后部署该模板来完成此操作。

由于 Functions 在动态横向扩展过程中使用 Azure 文件存储,因此在消耗计划和高级计划中不使用 Azure 文件存储运行时,扩展可能会受到限制。

装载文件共享

目前仅当在 Linux 上运行时,此功能才可用。

可以将现有 Azure 文件共享装载到 Linux 函数应用。 通过将共享装载到 Linux 函数应用,可以利用现有的机器学习模型或函数中的其他数据。 可以使用 az webapp config storage-account add 命令将现有共享装载到 Linux 函数应用。

在此命令中,share-name 是现有 Azure 文件共享的名称,custom-id 可以是在装载到函数应用时唯一定义共享的任何字符串。 此外,mount-path 是在函数应用中用于访问共享的路径。 mount-path 必须采用 /dir-name 格式,不能以 /home 开头。

有关完整示例,请参阅创建 Python 函数应用并装载 Azure 文件共享中的脚本。

目前仅支持 AzureFilesstorage-type。 只能将五个共享装载到给定函数应用。 装载文件共享可能会至少将冷启动时间增加 200-300 毫秒,当存储帐户处于不同区域时甚至会更多。

装载的共享可供处于指定 mount-path 的函数代码使用。 例如,当 mount-path/path/to/mount 时,可以通过文件系统 API 访问目标目录,如下面的 Python 示例所示:

import os
...

files_in_share = os.listdir("/path/to/mount")

后续步骤

详细了解 Azure Functions 托管选项。