如何在无服务器模型中初始化 Firebase 应用?什么是并发应用限制?



我创建了一个执行Firebase令牌验证的无服务器函数。

一切都按预期工作。除了,我在后续调用初始化我的应用程序时收到错误,默认应用程序已经存在(同一容器(。这就提出了一些问题。

  1. 如果我的无服务器基础结构要启动多个并发容器,每个容器都用于初始化应用程序。 这也会导致此错误吗?该应用程序在其他地方启动?或者此错误是隔离到本地实例的?
  2. 如果是后者,如果我根据启动应用的容器提供命名应用,那么一次可以初始化的应用的最大数量是否有 Firebase 限制?

这就是我现在初始化应用程序的方式:

cred = credentials.Certificate(SERVICE)
firebase_admin.initialize_app(cred)

我可以这样做,但不确定 firebase 应用程序限制或并发初始化(在文档中找不到任何细节(:

cred = credentials.Certificate(SERVICE)
firebase_admin.initialize_app(cred, 'APP-NAME-[CONTAINERID]')

或者,我应该使用我自己的 JWT 解码器并从谷歌获取公钥来重写它吗?

这是完整的错误:

Error occurred setting firebase credentials: The default Firebase app already exists. This means you called initialize_app() more than once without providing an app name as the second argument. In most cases you only need to call initialize_app() once. But if you do want to initialize multiple apps, pass a second argument to initialize_app() to give each app a unique name.

更新:AWS Lambda,Python。

我将使用以下方法进行测试,以防止在暖函数执行时在同一容器中重新初始化应用程序,并假设执行auth.validate_id_token()没有 API 限制,并且这不会与并发容器执行冲突。如果测试不同,请报告。

try:
firebase_admin.get_app()
logger.info('firebase already intialized.')
except ValueError as e:
logger.info('firebase not initialized. initialize.')
cred = credentials.Certificate(SERVICE)
firebase_admin.initialize_app(cred)

我可能仍然会迁移到另一个 JWT 验证以减小函数大小(因为我已经有一个 jwt 库供我自己的应用程序使用(,并摆脱依赖 Firebase API 对其进行解码。

如果在初始化管理员 SDK 时收到错误,指出默认应用已存在,则仅表示您尝试在同一进程中初始化管理 SDK 两次。 显然,不要那样做。 如果每个进程初始化一次且仅初始化一次,则永远不会看到此错误。

您必须注意每个服务器实例仅调用一次 init 方法。 从您显示的代码中不清楚您在做什么。 我不了解 python,但使用 node,您可以在全局上下文中初始化一次而不会出现问题。 如果您需要在函数执行期间初始化,您应该检查一些标志,以确保默认的 Firebase 应用尚未初始化,并且仅基于该标志有条件地初始化。

最新更新