【问题标题】:(gcloud.dataflow.flex-template.build) PERMISSION_DENIED: The caller does not have permission(gcloud.dataflow.flex-template.build) PERMISSION_DENIED:调用者没有权限
【发布时间】:2021-02-11 08:10:19
【问题描述】:

我正在尝试使用服务帐户构建弹性模板图像:

        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.admindataflow.serviceAgent 角色,我的服务帐户仍然无法执行此任务。

https://cloud.google.com/dataflow/docs/guides/templates/using-flex-templates 文档建议将 roles/owner 角色授予服务帐户,但我犹豫是否这样做,因为这意味着成为 CI/CD 管道的一部分并为服务帐户提供所有者角色除非我完全错了,否则对我来说没有任何意义。

在不向服务帐户授予所有者角色的情况下,是否有任何方法可以规避此问题?

【问题讨论】:

  • 1) 通常错误消息包括缺少的权限。在您的问题中发布整个错误消息。 2) Owner 角色是遗留的,一个项目中只有一两个人,甚至在 ORG 级别更好的人应该有这个角色。在您的示例中,您分配了很多管理员角色(它们真的有必要吗),这同样糟糕。例如,为什么 Cloud Dataflow 的服务帐户需要 App Engine、Cloud Functions 等的管理员权限?
  • 对于测试和开发,在确定正确的权限集时使用旧角色编辑器是可以的。如果角色编辑器失败,那么就会发生其他事情。
  • 是的,此服务帐户仅用于测试目的。有些角色是从以前的开发任务中遗留下来的,我同意这是一种不好的做法。但是,特别是对于这项任务,我仍然无法将第一个脚本作为我的 CI/CD 管道的一部分。错误消息只是说:ERROR: (gcloud.dataflow.flex-template.build) PERMISSION_DENIED: The caller does not have permission
  • 查看 Stackdriver 日志。应该记录失败的 API 调用,这可能有助于了解哪个 API 由于缺少权限而失败。
  • 嗨,我设法弄清楚我需要添加 roles/cloudbuild.builds.builder 才能开始构建作业。但是,我在构建步骤之后遇到了这个错误。如果您能帮我解决这个问题,我将不胜感激。 ERROR: (gcloud.dataflow.flex-template.build) HTTPError 403: <?xml version='1.0' encoding='UTF-8'?><Error><Code>AccessDenied</Code><Message>Access denied.</Message><Details>dev-tf-sa@XXX.iam.gserviceaccount.com does not have storage.objects.get access to the Google Cloud Storage object.</Details></Error>

标签: google-cloud-platform google-cloud-dataflow google-cloud-iam


【解决方案1】:

我刚刚遇到了完全相同的问题,并花了几个小时来解决这个问题。我们也使用 terraform 服务帐户。正如您所提到的,有两个主要问题:服务帐户访问和构建日志访问。

  1. 默认情况下,云构建将使用[project_number]@cloudbuild.gserviceaccount.com 形式的默认服务帐户,因此您需要授予此服务帐户权限以写入支持 gcr 容器注册表的 gcs 存储桶。我将roles/storage.admin 授予我的服务帐号。
  2. 就像你提到的,默认情况下,云构建将日志保存在gs://[project_number].cloudbuild-logs.googleusercontent.com。这似乎是项目中的一个隐藏桶,至少我看不到它。另外,不能为其配置google_storage_bucket_iam_member,而是根据doc的建议是在项目级别将roles/viewer提供给运行gcloud dataflow ...命令的服务帐户。

经过以上修改,我可以成功运行命令了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多