在 GCP 上使用 Pubsub 时如何解决身份验证范围不足的问题

Posted

技术标签:

【中文标题】在 GCP 上使用 Pubsub 时如何解决身份验证范围不足的问题【英文标题】:How to solve insufficient authentication scopes when use Pubsub on GCP 【发布时间】:2020-07-02 13:45:08 【问题描述】:

我正在尝试构建 2 个微服务(在 Java Spring Boot 中)以使用 GCP Pub/Sub 相互通信。

首先,我在本地笔记本电脑(http://localhost)中测试了程序(在 Eclipse 中)的工作方式,即一个微服务发布了消息,另一个使用 GCP 中创建的主题/订阅者成功接收了消息(以及凭证私钥:mypubsub.json)。

然后,我部署了相同的程序来运行 GCP,并得到以下错误:

- 2020-03-21 15:53:16.831 WARN 1 --- [bsub-publisher2] o.s.c.g.p.c.p.PubSubPublisherTemplate : Publishing to json-payload-sample-topic topic failed
- com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Request had insufficient authentication scopes. at com.google.api.gax.rpc.ApiExceptionFactory

我做了什么来部署程序(在容器中)以在 GCP/Kubernetes Engine 上运行:

    切换到我的项目后登录 Cloud Shell 进行 Pubsub 测试 Git 克隆我在 Eclipse 中测试的程序 将 mypubsub.json 文件移动到 /home/my_user_id 下 导出 GOOGLE_APPLICATION_CREDENTIALS="/home/my_user_id/mp6key.json" 运行“mvn clean package”构建微服务程序 运行“docker build”来创建镜像文件 运行 'docker push' 将镜像文件推送到 gcr.io repo 运行“kubectl create”以创建部署并公开服务

一旦部署和公开了 2 个微服务,当我尝试在浏览器中访问它们时,发布消息的微服务可以很好地从数据库中检索数据并处理数据,然后在尝试访问 GCP 时因上述错误而失败发布消息的 Pubsub API

任何人都可以提供有关检查什么来解决问题的提示吗?

【问题讨论】:

编辑您的问题以澄清。你提到了 Cloud Shell、Compute Engine 和 Kubernetes。您在使用什么以及用于哪个部分?您为容器正在使用的服务帐户分配了哪些角色? ***.com/help/minimal-reproducible-example 这与 Compute Engine 无关。基本上,我使用 Cloud Shell 作为工具将我的程序部署为在 GCP 上运行的容器(即使用 Google Kubernetes Engine 来运行我的应用程序的容器而不是 Cloud Run)。我将服务帐户分配为我的程序尝试为其发布消息的主题的 Pub/Sub 管理员。 那你为什么说“我也试图停止 VM 实例然后更新服务帐户”?你的问题需要提高焦点和清晰度。正如所写的那样,我什至无法尝试重现你所拥有的完成了,也不知道你真正的问题是什么。再次阅读我的第一条评论,然后阅读此链接:***.com/help/how-to-ask @John:这是我的理解问题:我认为我必须创建一个 VM 实例,即使我在 GCP 上通过 Contrainer(GKE) 运行我的应用程序,因此我在谷歌上搜索了更新服务的问题停止 VM 实例后,帐户以“允许对所有云 API 的完全访问”。根据您的最后评论,我意识到我的项目与 Compute Engine 无关,因此可能根本不需要创建 VM 实例。我只是试图停止 VM 实例并在 GCP 上重新运行我的服务,但仍然是同样的问题...... PS:我从我的问题中删除了与 VM 相关的部分,以免混淆其他人。 【参考方案1】:

该问题已按照指南解决:

https://cloud.google.com/kubernetes-engine/docs/tutorials/authenticating-to-cloud-platform

简单的解决方案是在deployment.yaml中添加以下行来加载凭证密钥:

        - name: google-cloud-key
          secret:
            secretName: pubsub-key
        containers:
        - name: my_container
          image: gcr.io/my_image_file
          volumeMounts:
          - name: google-cloud-key
            mountPath: /var/secrets/google
          env:
          - name: GOOGLE_APPLICATION_CREDENTIALS
            value: /var/secrets/google/key.json

【讨论】:

以上是关于在 GCP 上使用 Pubsub 时如何解决身份验证范围不足的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GCP 在 pubsub 模型中一次向所有订阅者发送消息

GCP PubSub:通过 CURL 类型的请求发布消息

GCP 云功能未正确接收/确认 PubSub 消息

如何从 GCP 函数 GUI 调用 PubSub 函数

GCP - 如何添加关于发送到 pubsub 死信队列的消息数量的警报?

将消息发布到 GCP pubSub 主题失败