GCP App Engine - 无法加载默认凭据

GCP App Engine - Could not load the default credentials

我正在开发一个使用 GCP 和 App Engine 的项目。在开发中它会打印出错误说:

2020-09-20 15:07:24 dev[development]  Error: Could not load the default credentials. Browse 
to https://cloud.google.com/docs/authentication/getting-started for more information.      
at GoogleAuth.getApplicationDefaultAsync (/workspace/node_modules/google-auth-
library/build/src/auth/googleauth.js:161:19)      at runMicrotasks (<anonymous>)      at 
processTicksAndRejections (internal/process/task_queues.js:97:5)      at runNextTicks 
(internal/process/task_queues.js:66:3)      at listOnTimeout (internal/timers.js:518:9)      
at processTimers (internal/timers.js:492:7)      at async GoogleAuth.getClient 
(/workspace/node_modules/google-auth-library/build/src/auth/googleauth.js:503:17)      at 
async GrpcClient._getCredentials (/workspace/node_modules/google-
gax/build/src/grpc.js:108:24)      at async GrpcClient.createStub 
(/workspace/node_modules/google-gax/build/src/grpc.js:229:23)

请记住,这是开发模式,但 运行 在 GCP App Engine 基础架构上,它不是 运行 在本地主机上。我正在使用以下命令查看日志:

gcloud app logs tail -s dev

根据 GCP App Engine 文档@https://cloud.google.com/docs/authentication/production#cloud-console

If your application runs inside a Google Cloud environment that has a default service 
account, your application can retrieve the service account credentials to call Google Cloud 
APIs.

我检查了我的应用引擎服务帐户。我有一个默认服务帐户,它是活动的。请在此处查看经过编辑的图片:

所以我想我的问题是:如果我有一个活动的默认服务帐户,并且我的应用程序应该在进行 API 调用时自动使用默认服务帐户密钥,为什么我会看到此身份验证错误?我做错了什么?

编辑:这是打印出错误的代码:

async function updateCrawledOnDateForLink (crawlRequestKey: EntityKey, linkKey: EntityKey): Promise<void> {

  try {
        
    const datastore = new Datastore();
    
    const crawlRequest = await datastore.get(crawlRequestKey)
    
    const brand = crawlRequest[0].brand.replace(/\s/g, "")
    
    await data.Link.update(
      +linkKey.id,
      { crawledOn: new Date() },
      null,
      brand)
        
  } catch (error) {
        console.error('updateCrawledOnDateForLink ERROR:', `CrawlRequest: ${crawlRequestKey.id}`, `Link: ${linkKey.id}`, error.message)
  }
}

我的预测是每次创建一个新的 Datastore() 都是问题所在,但请告诉我您的想法。

从几个函数中删除 new Datastore() 解决了问题这一事实表明问题不在于 App Engine 身份验证,而在于 Datastore,这证实了您共享的文档。

我认为问题在于当您出于某种未知原因在代码中创建 Datastore 的多个实例时,Datastore 丢失了凭据。

由于您在评论中提到您在代码中实际上不需要多个 Datastore 实例,因此您的问题的解决方案是在全局变量中使用单个实例并在多个函数中使用该变量。