Google Cloud 功能:无法加载默认凭据

Google Cloud 功能:无法加载默认凭据

我注意到Cloud Function通过 Pub/Sub 调用时出现错误。每次它都会抛出一个错误:

Error: Could not load the default credentials. Browse to https://cloud.google.com/docs/authentication/getting-started for more information.
    at GoogleAuth.getApplicationDefaultAsync (/srv/functions/node_modules/google-auth-library/build/src/auth/googleauth.js:161:19)
    at process._tickCallback (internal/process/next_tick.js:68:7)

我已经重新部署了它,并指定了使用凭证。并根据该建议重构了我的代码 https://stackoverflow.com/questions/58127896/error-could-not-load-the-default-credentials-firebase-function-to-firestore/58779000#58779000

但什么都没变。看起来谷歌发布了一些更新,导致它崩溃了。我想是因为我们的移动应用程序确实使用了 Firebase SDK 并直接调用了云函数。但它是用 Swift 编写的,而我的云函数是用 JS 编写的。所以这意味着我们正在使用不同的自由派,但有同样的问题有人知道这个问题吗?这对我的团队非常有帮助。提前谢谢。

答案1

出现此问题的原因有很多,解决方案也可能有所不同,

您可以尝试使用,gcloud auth application-default login因为您可能没有登录,因此最终可能会收到此错误,您可以看到这个stackoverflow 线程了解更多信息。

您可以明确指定要使用哪个服务帐户来代替默认帐户,如下所述验证

您还可以尝试将环境变量设置DETECT_GCP_RETRIES3,看看它是否有效。这可以在部署函数时通过以下方式完成:在 gcloud 中设置或更新

最后,正如你所说,这可能是因为你使用的版本。所以尝试将其更改为稳定版本。

答案2

正如在github 问题

在函数之外的全局范围内创建一个客户端将解决此问题参见:函数执行生命周期

如果你的代码如下所示:

const {CloudTasksClient} = require('@google-cloud/task');
// CloudTasksClient, could be Storage, or Vision, or Speech.
const task = new CloudTasksClient();
export.helloWorld = (req, res) => {
  res.send('hello world');
}

改为写:

const {CloudTasksClient} = require('@google-cloud/task');
// CloudTasksClient, could be Storage, or Vision, or Speech.
let task;
export.helloWorld = async (req, res) => {
  if (!task) {
    task = new CloudTasksClient();
  }
  await task.doSomething(); // or storage.doSomething(), etc.
  res.send('hello world');
}

采取行动保护人们免受这个问题的困扰。但是,正如执行时间线中所描述的,问题的核心是异步工作不能在你的函数的请求周期之外发生。

这也可能解决问题

使用 firebase-tools CL 部署时,您可以在云函数上设置环境变量

  • 将环境变量 DEBUG_AUTH 设置为 true

  • 跑步

    npm install --save @google-cloud/firestore@latest gcp-metadata@latest

有两种方法可以做到这一点:

1.官方(旧)方法是使用 gcloud 或 pantheon 设置变量。CLI 将在未来的部署中尊重该变量。

2.您可以选择使用点 env 文件管理环境变量(目前尚未公开)。您可以通过调用以下命令完成此操作:

firebase --open-sesame dotenv
#From their functions directory    
echo "DEBUG_AUTH=true" > .env  
firebase deploy --only functions

相关内容