【问题标题】:Failed to obtain the location of the Google Cloud Storage bucket获取 Google Cloud Storage 存储分区位置失败
【发布时间】:2019-03-31 21:45:54
【问题描述】:

我正在尝试使用 Java 客户端将数据从 S3 传输到 GCS,但出现此错误。

未能获取 Google Cloud Storage (GCS) 存储分区的位置 ___ 由于权限不足。请验证是否已授予必要的权限。

我正在使用具有项目所有者角色的服务帐户,该帐户应授予对所有项目资源的无限制访问权限。

【问题讨论】:

    标签: google-cloud-storage data-transfer


    【解决方案1】:

    Google Transfer Service 正在使用内部服务帐户来回移动数据。此帐户是自动创建的,不应与您自己创建的服务帐户混淆。

    您需要为此用户授予名为“旧版存储桶编写器”的权限。

    这是写在文档中的,但很容易错过:

    https://cloud.google.com/storage-transfer/docs/configure-access

    【讨论】:

    • 很高兴看到您找到了解决方案!您可以在发布 48 小时后接受自己的答案
    • 此外,这些角色应仅添加到特定的源和目标存储桶,而不是项目级别。当通过 GUI 手动配置时,这就是数据传输服务本身所做的。
    • 仅供参考,用户似乎是project-${var.project_number}@storage-transfer-service.iam.gserviceaccount.com
    • 可以使用这个APIcloud.google.com/storage-transfer/docs/reference/rest/v1/…获取数据传输服务正在使用的服务账号邮箱。
    【解决方案2】:

    感谢@thnee 的评论,我能够拼凑一个 terraform 脚本,将权限添加到隐藏的 Storage Transfer 服务帐户:

    data "google_project" "project" {}
    
    locals {
      // the project number is also available from the Project Info section on the Dashboard
      transfer_service_id = "project-${data.google_project.project.number}@storage-transfer-service.iam.gserviceaccount.com"
    }
    
    resource "google_storage_bucket" "backups" {
      location      = "us-west1"
      name          = "backups"
      storage_class = "REGIONAL"
    }
    
    data "google_iam_policy" "transfer_job" {
      binding {
        role = "roles/storage.legacyBucketReader"
    
        members = [
          "serviceAccount:${local.transfer_service_id}",
        ]
      }
    
      binding {
        role = "roles/storage.objectAdmin"
    
        members = [
          "serviceAccount:${local.transfer_service_id}",
        ]
      }
    
      binding {
        role = "roles/storage.admin"
    
        members = [
          "user:<GCP console user>",
          "serviceAccount:<terraform user doing updates>",
        ]
      }
    }
    
    resource "google_storage_bucket_iam_policy" "policy" {
      bucket      = "${google_storage_bucket.backups.name}"
      policy_data = "${data.google_iam_policy.transfer_job.policy_data}"
    }
    

    请注意,这会删除存储桶上存在的 OWNERREADER 中的 the default acls。这将阻止您访问控制台中的存储桶。因此,我们将 roles/storage.admin 添加回所有者用户和进行更改的 terraform 服务帐户。

    【讨论】:

      【解决方案3】:

      服务帐号的格式通常为 project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com。要查找您的服务帐户的格式,请使用 googleServiceAccounts.get API 调用。如果找不到,请使用上述约定分配以下角色(为我工作)

      然后给它分配角色:

      roles/storage.objectViewer  
      roles/storage.legacyBucketReader    
      roles/storage.legacyBucketWriter
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多