google-app-engine - “错误:无法加载默认凭据。” 在 App Engine 生产环境中
问题描述
几周前我一直在 AppEngine 中使用 Datastore,并且在生产环境中没有这样的访问问题。今天下午 1 点 SGT,尽管我从未部署到生产环境,但我的服务突然返回 500 错误并显示此错误消息。
错误:无法加载默认凭据。浏览到https://cloud.google.com/docs/authentication/getting-started了解更多信息。
使用我的 GCP 的默认凭据访问 Datastore 时可能会发生此错误:
const {Datastore} = require('@google-cloud/datastore');
const datastore = new Datastore();
const [shop] = await datastore.get(
datastore.key(['Shop', Number(phone)])
)
我的堆栈:
- 带有 nodejs10 的标准 AppEngine
- Koa, Next, 数据存储
在 App Engine 仪表板中,作为随机解决方案,我更改为旧版本。然后,它突然开始工作。然后,我改回原来的版本。它也运作良好。有什么线索吗?
嫌疑人1:当时,我在当地工作。虽然我从未部署,但我执行了一些 GCP 命令。这些不应该影响生产
export GOOGLE_APPLICATION_CREDENTIALS="[我的本地凭证 json 文件]"
gcloud 配置设置项目 [项目名称]
解决方案
似乎这个问题与 App Engine/Cloud Function 冷启动有关。在这种情况下,在初始化客户端库时,环境还没有加载凭据。
显然,它已在较新版本的客户端库中得到修复:https ://github.com/googleapis/gapic-generator-typescript/issues/287
但如果不是或者您不想升级@google-cloud/
客户端库,建议的解决方法是:
const {Datastore} = require('@google-cloud/datastore');
let datastore;
// If you are using it in a request handler
exports.handler = async (req, res) {
if (!datastore) {
datastore = new Datastore();
}
const [shop] = await datastore.get(
datastore.key(['Shop', Number(phone)])
);
}
另请参阅:https ://github.com/googleapis/google-auth-library-nodejs/issues/798#issuecomment-591622283
推荐阅读
- python - 为什么我没有从这个数组中得到最小的数字?
- php - .xlsx 下载后在 PhP 中刷新页面
- google-kubernetes-engine - 添加 VPC 服务边界时,私有 GKE 集群无法提取公共 GCR 映像。如何解决这个问题?
- bash - 如何在 Linux 中永久运行某些脚本而不会导致 CPU 风扇超速
- node.js - 带有通配符匹配的 npm pre/post 钩子
- winapi - CreateDIBSection 返回的 ppvBits 的大小是多少?
- reactjs - 如何在路由时发送参数而不使用 Next.js 中的查询
- r - 基于同一数据框中的另一列的条形图
- python - 正则表达式不匹配
- typescript - 'string' 类型的表达式不能用于索引类型 - 但我之前肯定做过吗?