是否有办法在不重新部署的情况下重新启动正在运行的Firebase函数(GCloud函数)示例?

fcg9iug3  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(156)

在生产环境中,我希望能够允许Firebase / GCloud管理员重新启动Firebase Function(GCloud Function)示例,而无需执行重新部署。
用例包括从外部服务重新加载内存缓存值或在Secret Manager中执行密钥轮换时。
有什么办法吗?

czfnxgou

czfnxgou1#

有一个通用的解决方案来重新启动功能在生产中是最有用的,因为有时一个罕见的状态条件可以由管理员快速重置,而不需要重新部署(他们可能无法做到)。
在研究缓存和秘密管理解决方案时,我发现了这些潜在的解决方案:

**选项1.**使用Firestore数据库触发器重新加载缓存的对象,但我不认为该事件会在所有运行的示例中触发(只有一个!),所以可能不是一个可行或安全的解决方案。
**选项2.**每次调用函数时轮询数据库,检查数据库值是否发生变化,以触发缓存重载。每次调用函数时都要这样做,这有点违背了缓存提高性能和降低成本的目的。
**选项3.使用计时器定期清除该高速缓存。缺点是必须等待这一情况发生,并可能意味着运行的示例可能同时具有不同的缓存值(除非您小心设置计时器)。对于密钥轮换使用情况(您经常需要在另一个外部服务上设置新密钥后立即强制重新加载),这不是一个真正的好解决方案。
选项4.*更改环境变量,并检测此更改以触发清除/重新加载该高速缓存或密钥。环境变量将传播到所有运行的示例。 我目前认为这可能是最好和最简单的方法 *。也可以与计时器方法结合使用。注意:我还没有证明
改变一个环境变量会改变现有运行示例中的新请求。
选项5可使用Cloud Runtime Configuration APIwatch for changes配置变量。
选项6对于secret,您可以将secret挂载为卷。如果您想引用secret的最新版本,这是一个很好的策略。例如,如果secret已经挂载到/etc/secrets/secret 1,则函数必须像这样读取此文件:

fs.readFileSync('/etc/secrets/secret1')

按照以下说明将secret配置为可作为挂载文件访问。这里也有手动将secret设置为环境变量的详细信息,但对于Firebase函数,最好是通过代码完成的支持方法。

未知

  • 当一个secret被配置为一个函数的环境变量时,GCloud/Firebase Functions运行时可能已经通过正在更新的环境变量将此更改传播到所有示例。
    功能愿望清单
  • 允许通过Firebase或GCloud控制台重新启动一个或所有功能
  • 提供一个API来重新启动函数示例,这样就可以通过编程来完成。这对一些系统管理工具很重要。
  • 注册机密的Firebase Functions将订阅机密管理器中的更改,并在机密更新时重新启动。
  • 注册Firebase事件触发器以在所有活动示例中运行

相关问题