我想编写一个简单的后端,以访问我的Google Cloud Firestore,它位于Google Kubernetes引擎中。在本地,我使用以下代码进行身份验证,以便像Google文档中所述访问Firestore。
if (process.env.NODE_ENV !== 'production') {
const result = require('dotenv').config()
//Additional error handling here
}
这会调用 GOOGLE_APPLICATION_CREDENTIALS 环境变量并使用我从创建具有 "Cloud Datastore User" 角色的服务帐户时获得的 google-application-credentals.json 来填充它。
因此,在本地,我的代码可以正常运行。我可以访问我的 Firestore 并且能够进行我需要的所有操作。然而,问题出现在我部署到 GKE 后。
我按照此 Google 文档 设置了我的集群的工作负载身份,创建了一个部署,并通过运行以下命令验证所有 pod 是否都在使用正确的 IAM 服务帐户:
kubectl exec -it POD_NAME -c CONTAINER_NAME -n NAMESPACE sh
> gcloud auth list
从文档上我了解到只要上述条件成立,我的服务就会处理身份验证。但是实际上我的Firestore()实例表现得好像没有必要的凭据来访问Firestore,这让我很困惑。
为了帮助理解,以下是我声明和实现该实例的方法:
const firestore = new Firestore()
const server = new ApolloServer({
schema: schema,
dataSources: () => {
return {
userDatasource: new UserDatasource(firestore)
}
}
})
更新:
在绝望之下,我决定把一切都拆除重建。逐步按照一切的步骤进行,我似乎遇到了一个错误,或者(更可能的是)第一次做错了一些事情。现在我能够连接到我的后端服务。但是,我现在遇到了不同的错误。发送任何请求时(我正在使用GraphQL,但本质上它是任何REST调用),我得到一个404错误。
检查日志会得到以下结果:
'尝试从插件获取元数据失败,出现错误:无法刷新访问令牌:在尝试检索计算引擎内置服务账户的访问令牌时返回了未找到的错误。这可能是因为计算引擎实例没有指定任何权限范围导致的:无法刷新访问令牌:响应状态码不成功。请求失败,状态代码为404'
对此问题进行简单的搜索似乎与我想要完成的任务无关,因此我又回到了起点。