如何为Dataflow自定义服务账户配置Pub/Sub最小权限?
解决Dataflow自定义服务账户创建水印跟踪订阅的最小权限问题
Dataflow创建水印跟踪订阅时,除了在源主题下创建新订阅的权限,还需要读取源订阅本身的元数据权限,这是之前权限配置遗漏的核心点。以下是符合最小权限原则的配置方案:
所需权限明细
无需授予项目级roles/pubsub.editor,只需给自定义服务账户绑定以下细粒度权限:
- 针对源Pub/Sub主题:
pubsub.subscriptions.create:允许在该主题下创建新的水印跟踪订阅pubsub.subscriber:允许消费该主题下所有订阅的消息(包括新创建的内部跟踪订阅)
- 针对源Pub/Sub订阅:
pubsub.subscriptions.get:允许读取源订阅的元数据(Dataflow需要通过此获取关联主题信息,才能创建跟踪订阅)
配置步骤
绑定主题权限:
通过GCP控制台或gcloud命令,给自定义服务账户绑定源主题的指定权限:# 绑定主题的订阅者权限 gcloud pubsub topics add-iam-policy-binding YOUR_SOURCE_TOPIC \ --member=serviceAccount:YOUR_CUSTOM_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/pubsub.subscriber # 绑定主题的订阅创建权限 gcloud pubsub topics add-iam-policy-binding YOUR_SOURCE_TOPIC \ --member=serviceAccount:YOUR_CUSTOM_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com \ --permission=pubsub.subscriptions.create绑定源订阅权限:
给自定义服务账户绑定源订阅的读取权限:gcloud pubsub subscriptions add-iam-policy-binding YOUR_SOURCE_SUBSCRIPTION \ --member=serviceAccount:YOUR_CUSTOM_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com \ --permission=pubsub.subscriptions.getDataflow基础权限:
确保自定义服务账户拥有Dataflow作业运行的基础权限:gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member=serviceAccount:YOUR_CUSTOM_SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/dataflow.worker
原理说明
Dataflow创建水印跟踪订阅时,会先调用Subscriber.GetSubscription API读取源订阅的配置(比如关联的主题),之后再调用Subscriber.CreateSubscription在对应主题下创建内部订阅。之前仅给主题权限时,因缺少源订阅的get权限,导致第一步API调用失败触发403错误。通过补充源订阅的读取权限,同时仅给主题必要的订阅创建和消费权限,即可在不授予项目级Pub/Sub权限的前提下完成操作。
内容的提问来源于stack exchange,提问作者Joseph Lust
相关产品推荐
相关产品推荐

