问题描述
我正在尝试使用服务帐户构建弹性模板图像:
gcloud dataflow flex-template build "$TEMPLATE_PATH" \
--image-gcr-path "$TEMPLATE_IMAGE" \
--sdk-language "JAVA" \
--flex-template-base-image JAVA11 \
--Metadata-file "Metadata.json" \
--jar "target/XXX.jar" \
--env FLEX_TEMPLATE_JAVA_MAIN_CLASS="XXX"
服务帐号具有以下角色:
"roles/appengine.appAdmin","roles/bigquery.admin","roles/cloudfunctions.admin","roles/cloudtasks.admin","roles/compute.viewer","roles/container.admin","roles/dataproc.admin","roles/iam.securityAdmin","roles/iam.serviceAccountAdmin","roles/iam.serviceAccountUser","roles/iam.roleAdmin","roles/resourcemanager.projectIamAdmin","roles/pubsub.admin","roles/serviceusage.serviceUsageAdmin","roles/servicemanagement.admin","roles/spanner.admin","roles/storage.admin","roles/storage.objectAdmin","roles/firebase.admin","roles/cloudconfig.admin","roles/vpcaccess.admin","roles/compute.instanceAdmin.v1","roles/dataflow.admin","roles/dataflow.serviceAgent"
然而,即使使用 dataflow.admin
和 dataflow.serviceAgent
角色,我的服务帐户仍然无法执行此任务。
文档 https://cloud.google.com/dataflow/docs/guides/templates/using-flex-templates 建议将 roles/owner
角色授予服务帐户,但我对此犹豫不决,因为这是 CI/CD 管道的一部分并提供服务除非我完全错了,否则所有者角色对我来说没有意义。
在不向服务帐号授予所有者角色的情况下,有什么办法可以规避此问题?
解决方法
我刚刚遇到了完全相同的问题,并花了几个小时来解决这个问题。我们也使用 terraform 服务帐户。正如您提到的,有两个主要问题:服务帐户访问和构建日志访问。
- 默认情况下,cloud build 将使用
[project_number]@cloudbuild.gserviceaccount.com
形式的默认服务帐户,因此您需要向此服务帐户授予权限以写入支持 gcr 容器注册表的 gcs 存储桶。我已向我的服务帐户授予roles/storage.admin
。 - 就像您提到的,默认情况下,云构建将日志保存在
gs://[project_number].cloudbuild-logs.googleusercontent.com
。这似乎是项目中的隐藏桶,至少我是看不到的。此外,不能为其配置google_storage_bucket_iam_member
,相反,根据此 doc 的建议是在项目级别将roles/viewer
提供给运行gcloud dataflow ...
命令的服务帐户.
经过上述更改后,我能够成功运行该命令。