Dataflow Flex模板运行时自定义服务账号配置失效问题排查
我希望替代Dataflow Worker默认使用的default-compute@developer.gserviceaccount.com服务账号,改用自定义服务账号,执行了以下gcloud命令:
gcloud dataflow flex-template run "flexing" \ --project=$(PROJECT)\ --template-file-gcs-location=$(JSON_PATH) \ --service-account-email=$(MY_SA) \ --region=europe-west1 \ --parameters=source=$(MY_SOURCE) \ --temp-location=$(TEMP_LOCATION) \ --staging-location=$(STAGING_LOCATION)
作业正常启动,但后续报错:
Unable to open template file: gs://..../template_launches/..../operation_result..
由于镜像存储在其他项目,默认SA没有artifact.reader权限导致失败。查看日志发现:
compute.instances.insert.authenticationInfo.principalEmail = default-compute@developer.gserviceaccount.com
推测作业回退到了默认SA;仅在request.ServiceAccounts.email中能看到自定义SA。请问为何始终回退到默认SA?
原因分析及解决方案
1. 自定义SA缺少Dataflow Worker核心权限
指定的自定义SA必须具备Dataflow Worker运行的基础权限,否则系统会自动 fallback 到默认SA。需确保自定义SA拥有以下权限(推荐通过预定义角色快速配置):
roles/dataflow.worker:Dataflow Worker基础角色roles/storage.objectAdmin:访问GCS临时目录、staging目录及模板文件的权限roles/artifactregistry.reader(若镜像存于Artifact Registry):跨项目读取镜像的权限
2. 未授予Dataflow服务代理 impersonation 权限
Dataflow服务本身需要能 impersonate 你的自定义SA来创建Worker实例。需给Dataflow服务代理账号(格式为service-<PROJECT_NUMBER>@dataflow-service-producer-prod.iam.gserviceaccount.com)授予对自定义SA的roles/iam.serviceAccountUser角色。
操作命令示例:
PROJECT_NUMBER=$(gcloud projects describe $(PROJECT) --format='value(projectNumber)') gcloud iam service-accounts add-iam-policy-binding $(MY_SA) \ --member="serviceAccount:service-${PROJECT_NUMBER}@dataflow-service-producer-prod.iam.gserviceaccount.com" \ --role="roles/iam.serviceAccountUser"
3. Flex Template JSON文件硬编码了服务账号
若你指定的$(JSON_PATH)模板JSON文件中已经设置了serviceAccountEmail字段,会覆盖gcloud命令行参数。检查该JSON文件,确保未设置该字段,或直接将其值改为目标自定义SA。
4. 项目级Dataflow默认SA配置冲突
若项目中通过Dataflow API设置了默认服务账号,会优先于命令行参数。可通过以下命令检查并清除:
gcloud dataflow configs update --disable-default-service-account --project=$(PROJECT)
内容的提问来源于stack exchange,提问作者Jh123

