Spring Cloud Stream Pub/Sub消费者需Topic的GetTopic权限而非订阅权限
问题分析与解决方案
原因
你遇到的情况是因为Spring Cloud Stream GCP Pub/Sub binder在以下条件下会主动验证Topic的存在:
- 配置了
destination指向目标Topic - 关闭了自动创建资源(
auto-create-resources=false)
这个验证过程会调用Google Pub/Sub的topics.get API,因此要求服务账号拥有pubsub.topics.get权限,而非仅订阅相关的权限。
解决方案
方案1:移除不必要的destination配置
既然你已经明确指定了订阅名(subscriptionName),订阅本身已经与目标Topic绑定,消费者通过订阅拉取消息不需要再关联Topic。移除spring.cloud.stream.bindings.myCosnumer-in-0.destination配置项即可,调整后的配置如下:
spring.cloud.stream.gcp.pubsub.default.consumer.auto-create-resources=false spring.cloud.stream.gcp.pubsub.default.producer.auto-create-resources=false spring.cloud.function.definition=myCosnumer spring.cloud.stream.gcp.pubsub.bindings.myCosnumer-in-0.consumer.subscriptionName=projects/projectId/subscriptions/my-topic-sub spring.cloud.stream.bindings.myCosnumer-in-0.binder=pubsub spring.cloud.stream.bindings.myCosnumer-in-0.content-type=application/json
调整后,binder不会再尝试验证Topic,仅需要订阅相关的权限(如pubsub.subscriptions.consume)即可正常拉取消息。
方案2:保留destination并补充Topic权限
如果业务场景需要保留destination配置,需要给服务账号添加pubsub.topics.get权限。可以直接授予roles/pubsub.viewer角色(该角色包含此权限),或者创建自定义角色仅包含pubsub.topics.get权限。
内容的提问来源于stack exchange,提问作者Patan
相关产品推荐
相关产品推荐

