如何解决如何使用pubsub在死信订阅上自动分配发布者角色和订阅者角色?
我正在升级以前使用RabbitMQ的队列处理系统。
我目前正在导入RabbitMQ具备的死信和指数补偿功能,但是我似乎遇到了两个问题。
主要问题是,当我创建带有死信策略的新订阅时,它似乎没有所需的关联权限,Google才能将邮件转发到我的死信订阅。
如下所示,在检查订阅详细信息时,谷歌强调指出,该项目的pubsub服务帐户需要具有发布者角色和订阅者角色才能发布并转发至死信主题。
用户界面中提供了添加这些选项的选项,但是我需要完全通过我正在运行的使用者来处理此问题,因为这需要一个自动化的过程,因为这些使用者是由SupervisorD在后台运行的。
有人知道我到底缺少了什么吗,我已经阅读了所有文档,但是还不完全清楚,我尝试将IAM中提到的权限添加到关联成员,但是没有骰子。 / p>
解决方法
根据the documentation,您必须授予托管源主题的项目的服务代理(sa)Pubsub服务帐户,并在死信主题上使用角色Pubsub Publisher。
->授权源项目在死信主题中发布消息
您还必须授予托管死信主题的项目的服务代理(sa)Pubsub服务帐户,在其上配置了死信功能的订单上具有Pubsub订阅服务器角色。
->授权确认死信主题中张贴的死信消息。
此处是服务代理PubSub服务帐户的模式
service-${project-number}@gcp-sa-pubsub.iam.gserviceaccount.com
,
为了将消息转发到死信主题,发布/订阅必须具有permission才能执行以下操作:
- 将消息发布到死信主题。
- 确认转发的消息,这会将它们从订阅中删除。
如果您想通过运行的使用者为每个文档授予所需的权限,我建议先通过Cloud SDK通过adding the publisher role进行操作:
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"
然后是subscriber role:
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"
有了该权限,您现在可以track the delivery attempts使用您喜欢的语言,例如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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。