gpt4 book ai didi

node.js - 使用 Workload Identity 从 GKE 向 Google Cloud Firestore 进行身份验证

转载 作者:行者123 更新时间:2023-12-02 11:32:24 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的后端来访问我的 Google Cloud Firestore,它位于 Google Kubernetes Engine 中。在我的本地,我使用以下代码对 Firestore 进行身份验证,如 Google 文档中所述。

if (process.env.NODE_ENV !== 'production') {
const result = require('dotenv').config()
//Additional error handling here
}
这会拉取 GOOGLE_APPLICATION_CREDENTIALS 环境变量并用我的 google-application-credentals.json 填充它这是我通过使用 "Cloud Datastore User" 创建服务帐户而获得的角色。
所以,在本地,我的代码运行良好。我可以到达我的 Firestore 并做我需要做的一切。但是,一旦我部署到 GKE,问题就会出现。
我关注了这个 Google Documentation为了为我的集群设置工作负载身份,我创建了一个部署并通过运行验证所有 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)
}
}
})
更新:
出于绝望,我决定拆除所有东西并重新 build 它。一步一步地完成所有事情,我似乎遇到了错误,或者(更有可能)我第一次做错了一些事情。我现在可以连接到我的后端服务。 然而 ,我现在收到一个不同的错误。发送任何请求(我使用的是 GraphQL,但本质上它是任何 REST 调用)后,我会返回 404。
检查日志会产生以下结果: 'Getting metadata from plugin failed with error: Could not refresh access token: A Not Found error was returned while attempting to retrieve an accesstoken for the Compute Engine built-in service account. This may be because the Compute Engine instance does not have any permission scopes specified: Could not refresh access token: Unsuccessful response status code. Request failed with status code 404'对此问题的粗略搜索似乎没有返回与我要完成的任务相关的任何内容,因此我又回到了原点。

最佳答案

我认为你最初的假设是正确的!如果您仍然需要指定范围,Workload Identity 将无法正常运行。在您链接的工作负载文章中,未使用范围。
我一直在为同样的问题苦苦挣扎,并确定了三种在 pod 中获取经过身份验证的凭据的方法。

1.工作负载标识 (基本上是上面的 Workload Identity 文章,添加了一些部署细节)
这种方法是首选,因为它允许集群中的每个 pod 部署只被授予它需要的权限。
创建集群(注意:没有定义范围或服务帐户)

gcloud beta container clusters create {cluster-name} \
--release-channel regular \
--identity-namespace {projectID}.svc.id.goog

然后创建 k8sServiceAccount,分配角色并注释。
gcloud container clusters get-credentials {cluster-name}

kubectl create serviceaccount --namespace default {k8sServiceAccount}

gcloud iam service-accounts add-iam-policy-binding \
--member serviceAccount:{projectID}.svc.id.goog[default/{k8sServiceAccount}] \
--role roles/iam.workloadIdentityUser \
{googleServiceAccount}

kubectl annotate serviceaccount \
--namespace default \
{k8sServiceAccount} \
iam.gke.io/gcp-service-account={googleServiceAccount}
然后我创建我的部署,和 设置 k8sServiceAccount .
(设置服务帐户是我缺少的部分)
kubectl create deployment {deployment-name} --image={containerImageURL}
kubectl set serviceaccount deployment {deployment-name} {k8sServiceAccount}
然后用 8080 的目标曝光
kubectl expose deployment {deployment-name}  --name={service-name} --type=LoadBalancer --port 80 --target-port 8080
googleServiceAccount 需要分配适当的 IAM 角色(见下文)。

2.集群服务帐号
这种方法不是首选,因为集群中的所有 VM 和 Pod 都将具有基于定义的服务帐户的权限。
使用分配的服务帐户创建集群
gcloud beta container clusters create [cluster-name] \
--release-channel regular \
--service-account {googleServiceAccount}
googleServiceAccount 需要分配适当的 IAM 角色(见下文)。
然后如上部署和公开,但不设置k8sServiceAccount

3. 范围
这种方法不是首选,因为集群中的所有 VM 和 Pod 都将具有基于定义的范围的权限。
创建具有指定范围的集群(firestore 只需要“云平台”,实时数据库也需要“userinfo.email”)
gcloud beta container clusters create $2 \
--release-channel regular \
--scopes https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/userinfo.email

然后如上部署和公开,但不设置k8sServiceAccount

前两种方法需要一个分配了适当 IAM 角色的 Google 服务帐户。以下是我为让一些 Firebase 产品正常工作而分配的角色:
  • FireStore:云数据存储用户(数据存储)
  • 实时数据库:Firebase 实时数据库管理员(Firebase 产品)
  • 存储:存储对象管理员(云存储)
  • 关于node.js - 使用 Workload Identity 从 GKE 向 Google Cloud Firestore 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62639844/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com