我正在编写的一些函数需要在某个地方存储和共享一组加密密钥(<1kb(,以便:
- 它在函数之间和同一函数的实例中共享
- 它在功能部署后进行维护
根据密钥是否已过期或需要创建新密钥,每4小时左右修改(和写入(一次密钥。
现在,我将密钥作为加密二进制存储在云存储桶中,访问权限仅限于该功能。它可以工作,只是速度相当慢(更新密钥时需要大约500ms的读/写(。
我考虑过其他一些解决方案:
- Redis:速度很快,但考虑到存储单个值的价格(每月40美元(,这太夸张了
- 云SQL:函数已经连接到云实例,因此不会产生更多成本
- 删除所有内容并使用KMS。不幸的是,它不符合我的要求
我在函数中使用的库在这里可用。
有没有更好的方法来为云功能(可能还有GKE等其他工具(存储一小块数据?
编辑
我最终使用的解决方案是在应用程序已经连接的数据库中使用一个表。它也比使用bucket(<100ms(快5倍。
这个故事的寓意是使用已经提供的任何东西来存储密钥。如果存储密钥是个问题,那么使用下面描述的组合KMS+云函数进行旋转似乎是一个不错的选择。
所有代码+更多详细信息可在此处获取。
更好的方法是使用Cloud KMS管理密钥。然而,正如你之前提到的,Cloud KMS不会自动删除旧的密钥版本材料,你需要手动删除旧版本,我怀疑这是你不想做的事情。
另一种可能性是把钥匙放在Firestore里。因此,您不必提供任何特定的基础设施,如Redis Memorystore和Postgres Cloud SQL,从长远来看,它将更容易管理和扩展。
一般的想法是让Cloud Scheduler每4小时触发一次Cloud Function,该函数将旋转Cloud Firestore上的键。
你觉得怎么样?