Azure Functions 的存储注意事项

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

存储服务 函数用法
Azure Blob 存储 维护绑定状态和函数密钥。
还由 Durable Functions 中的任务中心使用。
Azure 文件 文件共享,用于存储和运行消耗计划高级计划中的函数应用代码。
Azure 队列存储 Durable Functions 中的任务中心使用。
Azure 表存储 Durable Functions 中的任务中心使用。

重要

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

存储帐户要求

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

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

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

存储帐户指导

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

存储帐户位置

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

存储帐户连接设置

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

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

共享存储帐户

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

优化存储性能

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

存储数据加密

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

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

区域内数据驻留

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

其他由平台管理的客户数据只有托管在内部负载均衡的应用服务环境(简称 ASE)中时才会存储在该区域内。 若要了解详细信息,请参阅 ASE 区域冗余

装载文件共享

目前仅当在 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 托管选项。