近日在监控中发现本人的几个函数应用所使用的存储产生了大量的费用。明明一个每日执行次数不超过 300 次的函数应用,为什么在短短一周内就产生了 $3 的费用呢?

经过分析,这是本人手贱将存储帐户从 v1 升级到 v2 导致的。函数应用中的队列触发器与持久函数框架都是通过对队列存储轮询实现的,这会产生大量的队列操作。而仔细观察 Azure 队列存储的定价策略,会发现 v2 存储帐户中队列操作的定价是 v1 的十倍。

另外,Azure 函数在运行中也需要执行大量对象存储操作。对于这类操作,v2 帐户的操作定价也是更昂贵的,甚至可达 100 倍之高。截至本文发布,部分存储操作每万次价格的比较如下表所示 (假设使用标准 LRS 与热存储,单位为美元),这些操作是函数应用所经常使用的。

操作类型 v1 价格 v2 价格 提升倍数
对象 - 写入 0.00036 0.05 138.89
对象 - 容器 0.00036 0.05 138.89
对象 - 读取 0.00036 0.004 11.11
对象 - 其它 0.00036 0.004 11.11
队列 - 全部 0.0004 0.004 10.00
表 - 全部 0.00036 0.00036 1.00

存储帐户 v2 的优势是提供了分级存储、原生静态网页托管、数据湖等新的功能,并且在存储大量数据时存储价格优势。而这些优势是函数应用场景中无法体现的。因此,没有必要将函数应用所使用的存储帐户升级为 v2 帐户。另外,Microsoft 所提供的各个函数应用部署工具所自动创建的存储帐户也是 v1 帐户。

目前 Azure 提供了将 v1 帐户原地升级到 v2 的命令,却无法将 v2 帐户降级为 v1 帐户。要实现降级,必须创建新的帐户并迁移原帐户数据。

降级后,存储费用恢复了正常的水平。