【问题标题】:How to add subscriber role and publisher role to deadletter for google cloud pubsub using nodeJS?如何使用nodeJS将订阅者角色和发布者角色添加到谷歌云发布订阅的死信?
【发布时间】:2021-02-08 17:27:59
【问题描述】:

我们一直在关注 https://cloud.google.com/pubsub/docs/dead-letter-topicsnodeJS client 来创建、更新我们的 pubsub 主题和订阅,但在关注之后:

async function createSubscriptionWithDeadLetterPolicy() {
  // Creates a new subscription
  await pubSubClient.topic(topicName).createSubscription(subscriptionName, {
    deadLetterPolicy: {
      deadLetterTopic: pubSubClient.topic(deadLetterTopicName).name,
      maxDeliveryAttempts: 10,
    },
  });
  console.log(
    `Created subscription ${subscriptionName} with dead letter topic ${deadLetterTopicName}.`
  );
  console.log(
    'To process dead letter messages, remember to add a subscription to your dead letter topic.'
  );
}

我们在死信中得到这个

This 建议在 CLI 中为每个死信运行命令,但我们不想为每个订阅手动执行此操作有没有办法在 nodeJS 客户端本身中执行此操作? 或者对所有订阅一劳永逸地这样做,甚至对于稍后将在给定项目中创建的新订阅也是如此。

【问题讨论】:

    标签: node.js google-cloud-pubsub google-api-nodejs-client


    【解决方案1】:

    根据the documentation的这一部分,您需要为PubSub服务代理服务帐户授予2个角色。当然,您可以通过 API 调用来实现。而且,这并不容易!

    其实不难,就是无聊!为什么?因为,您不能只“添加”一个策略,而是设置整个策略。要实现这一点:

    • 获取所有现有政策
    • 在现有列表中添加您的政策
    • 提交新的政策列表。

    你需要这样做:

    • 通过在项目级别设置策略来全局设置。更简单但不太安全(打破最小权限原则)
    • 或者在每个死信主题和每个设置了死信的订阅上。

    你有code example in the Client library doc


    EDIT1

    如果您编写了授权访问机制的脚本,您不必关心是否找到它:它存在,仅此而已!也许你没有在控制台上查看它,但它存在。只有模式很重要:

    service-<project-number>@gcp-sa-pubsub.iam.gserviceaccount.com
    

    如果您在控制台上寻找它,现在很棘手!你必须去访问-> IAM。然后点击右上角的复选框以显示 Google 技术帐户

    【讨论】:

    • 由于我找不到 PubSub 服务代理服务帐户,请您告诉我如何为整个项目执行此操作
    • 感谢您抽出宝贵时间
    【解决方案2】:

    如果有人需要,以下是我根据@guillaume blaquiere 的回答编写的函数:

      private async bindPolicyToSubscriber(
        subscriptionTopicName: string,
        subscriptionName: string,
      ) {
        if (process.env.PROJECT_NUMBER) {
          try {
            const pubSubTopic = this.getClient().topic(subscriptionTopicName);
            const myPolicy = {
              bindings: [
                {
                  role: 'roles/pubsub.subscriber',
                  members: [
                    `serviceAccount:service-${process.env.PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com`,
                  ],
                },
              ],
            };
            await pubSubTopic
              .subscription(subscriptionName)
              .iam.setPolicy(myPolicy);
          } catch (e) {
            console.error('Error while binding policy.', e);
          }
        }
      }
    
      private async bindPolicyToDeadLetterTopic(deadLetterTopicName: string) {
        if (process.env.PROJECT_NUMBER) {
          try {
            const pubSubTopic = this.getClient().topic(deadLetterTopicName);
            const myPolicy = {
              bindings: [
                {
                  role: 'roles/pubsub.publisher',
                  members: [
                    `serviceAccount:service-${process.env.PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com`,
                  ],
                },
              ],
            };
            await pubSubTopic.iam.setPolicy(myPolicy);
          } catch (e) {
            console.error('Error while binding policy.', e);
          }
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2022-12-11
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多