如何使用 pubsub 自动分配死信订阅的发布者角色和订阅者角色?

And*_*ira 5 publish-subscribe google-cloud-platform

我正在升级以前使用 RabbitMQ 的队列处理系统。

我目前正在导入 RabbitMQ 中的死信和指数退避功能,但是我似乎遇到了一些问题。

主要问题是,当我使用死信策略创建新订阅时,它似乎没有 Google 将消息转发到我的死信订阅所需的相关权限。

如下所示,在检查订阅详细信息时,Google 强调了该项目的 pubsub 服务帐户需要发布者角色和订阅者角色,以便发布并转发到死信主题。

UI 中提供了添加这些选项的选项,但是我需要完全通过我正在运行的使用者来处理此操作,因为这需要是一个自动化过程,因为这些使用者是由 SupervisorD 在后台运行的。

有谁知道我到底缺少什么,我已经阅读了所有文档,但并不完全清楚,我尝试将 IAM 中提到的权限添加到关联成员,但没有成功。

问题说明

小智 5

为了将消息转发到死信主题,Pub/Sub 必须有权执行以下操作:

  • 向死信主题发布消息。
  • 确认转发的消息,这会将它们从订阅中删除。

如果您想通过正在运行的使用者授予每个文档所需的权限,我建议通过Cloud SDK首先添加发布者角色

PUBSUB_SERVICE_ACCOUNT="service-${project-number}@gcp-sa-pubsub.iam.gserviceaccount.com"

gcloud pubsub topics add-iam-policy-binding dead-letter-topic-id \
    --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\
    --role="roles/pubsub.publisher"
    
Run Code Online (Sandbox Code Playgroud)

然后,订阅者角色

PUBSUB_SERVICE_ACCOUNT="service-${project-number}@gcp-sa-pubsub.iam.gserviceaccount.com"

gcloud pubsub subscriptions add-iam-policy-binding subscription-id \
    --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\
    --role="roles/pubsub.subscriber"
    
Run Code Online (Sandbox Code Playgroud)

有了该权限,您现在可以使用您喜欢的语言(例如 Python)来跟踪交付尝试:

from concurrent.futures import TimeoutError
from google.cloud import pubsub_v1

# TODO(developer)
# project_id = "your-project-id"
# subscription_id = "your-subscription-id"

subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(project_id, subscription_id)

def callback(message):
    print("Received message: {}".format(message))
    print("With delivery attempts: {}".format(message.delivery_attempt))
    message.ack()

streaming_pull_future = subscriber.subscribe(subscription_path, callback=callback)
print("Listening for messages on {}..\n".format(subscription_path))

# Wrap subscriber in a 'with' block to automatically call close() when done.
with subscriber:
    # When `timeout` is not set, result() will block indefinitely,
    # unless an exception is encountered first.
    try:
        streaming_pull_future.result(timeout=timeout)
    except TimeoutError:
        streaming_pull_future.cancel()
Run Code Online (Sandbox Code Playgroud)


gui*_*ere 1

根据文档,您必须向托管源主题的项目的服务代理 (sa) Pubsub 服务帐户授予死信主题的 Pubsub 发布者角色。

-> 授权源项目在Dead letter主题中发布消息

您还必须向托管死信主题的项目的服务代理 (sa) Pubsub 服务帐户授予配置了死信功能的 souscription 的 Pubsub 订阅者角色。

-> 授权确认死信主题中发布的死信消息。

这里是服务代理 PubSub 服务帐户的模式

service-${project-number}@gcp-sa-pubsub.iam.gserviceaccount.com
Run Code Online (Sandbox Code Playgroud)