(gcloud.dataflow.flex-template.build)PERMISSION_DENIED:调用者没有权限
(gcloud.dataflow.flex-template.build) PERMISSION_DENIED: The caller does not have permission
我正在尝试使用服务帐户构建弹性模板图像:
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 服务帐户。正如您提到的,有 2 个主要问题:服务帐户访问和构建日志访问。
- 默认情况下,云构建将使用形式为
[project_number]@cloudbuild.gserviceaccount.com
的默认服务帐户,因此您需要对该服务帐户具有 g运行t 权限才能写入支持 gcr 容器注册表的 gcs 存储桶.我 g运行ted roles/storage.admin
到我的服务帐户。
- 正如您提到的,默认情况下,云构建将日志保存在
gs://[project_number].cloudbuild-logs.googleusercontent.com
。这似乎是项目中的一个隐藏桶,至少我看不到它。此外,无法为其配置 google_storage_bucket_iam_member
,而是根据此 doc 的建议是在项目级别将 roles/viewer
提供给服务帐户 运行ning gcloud dataflow ...
命令。
经过上述更改后,我能够 运行 命令成功。
我正在尝试使用服务帐户构建弹性模板图像:
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 服务帐户。正如您提到的,有 2 个主要问题:服务帐户访问和构建日志访问。
- 默认情况下,云构建将使用形式为
[project_number]@cloudbuild.gserviceaccount.com
的默认服务帐户,因此您需要对该服务帐户具有 g运行t 权限才能写入支持 gcr 容器注册表的 gcs 存储桶.我 g运行tedroles/storage.admin
到我的服务帐户。 - 正如您提到的,默认情况下,云构建将日志保存在
gs://[project_number].cloudbuild-logs.googleusercontent.com
。这似乎是项目中的一个隐藏桶,至少我看不到它。此外,无法为其配置google_storage_bucket_iam_member
,而是根据此 doc 的建议是在项目级别将roles/viewer
提供给服务帐户 运行ninggcloud dataflow ...
命令。
经过上述更改后,我能够 运行 命令成功。