node.js - Google Pub/Sub 上的 GRPC 权限被拒绝 [错误 7]

标签 node.js google-cloud-platform grpc google-cloud-pubsub

我想向 Google Cloud pubsub 上的主题发布消息。但我收到一个 Error: 7 PERMISSION_DENIED,我在本地主机上运行,​​试图发布到常规的 Cloud PubSub。

我实例化客户端并获取我想要发布的主题:

import { Encodings, PubSub } from '@google-cloud/pubsub';
import { readFileSync } from 'fs';

const client = new PubSub({
  credentials: JSON.parse(
    readFileSync(
      '/Users/me/pubsub/publisher/mb-sandbox.json'
    ).toString()
  )
});

const topic = client.topic('dummy_topic');

其中 mb-sandbox.json 是 pubsub 授权服务帐户的凭据。我还尝试设置和使用 $GOOGLE_APPLICATION_CREDENTIALS env var。

但这似乎工作正常,因为我可以使用以下方法检索我的 gcp 项目的正确 ID:client.auth.getProjectId()

当我尝试发布消息(应遵循架构)时:

const DUMMY_MSG = {
    type: 'CARD',
    severity: 'INFO',
    user_id: 2000,
    text_content: 'TEST MESSAGE'
 };

const dataBuffer = Buffer.from(JSON.stringify(DUMMY_MSG));

const messageId = await topic.publishMessage({ data: dataBuffer });

我收到一个错误:7 PERMISSION_DENIED:用户无权执行此操作。如果我没记错的话,这就是 GRPC 上的 403 等效项。

{
  code: 7,
  details: 'User not authorized to perform this action.',
  metadata: Metadata { internalRepr: Map(0) {}, options: {} },
  note: 'Exception occurred in retry method that was not classified as transient'
}

我遵循了 GCP Nodejs 代码示例,我的服务帐户绝对得到认可并且有权在 Cloud PubSub 上发布。

任何帮助将不胜感激。

最佳答案

抱歉,我被困在这个问题上一天了,但我在发布问题后立即找到了方法......

已经有人解决了 here 。我必须针对我想要向其发送消息的主题专门向 pubsub 发布者服务帐户添加授权。

由于某种原因,从服务帐户面板设置角色不起作用,请从主题授权面板进行设置。

关于node.js - Google Pub/Sub 上的 GRPC 权限被拒绝 [错误 7],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72741308/

相关文章:

node.js - 使用 AWS api 网关将图像文件上传到 aws lambda

python - 使用 Python 客户端 API 在 Google Cloud Pub/Sub 中运行同步拉取

ssh - VM 重新启动后无法通过 SSH Google Cloud VM 实例

ruby-on-rails - rspec `described_class` 是 `nil`

c++ - 当指针作为对方法的引用传递时,如何在 C++ 中使用 void* 来保存 uint32_t 的值

node.js - 表示不发送静态目录

javascript - Node.JS - 在模块中使用原型(prototype)

machine-learning - tensorflow 中的多热编码(谷歌云机器学习,tf estimator api)

grpc - 连接错误 io.netty.handler.codec.http2.Http2Exception : HTTP/2 client preface string missing or corrupt. 接收字节的十六进制转储:

javascript - 使用 Node.js 调用 child_process 与从 C 调用子进程并创建 C++ 绑定(bind)以从 node.js 调用