无法获取Google Cloud Storage存储桶的位置

时间:2018-10-27 09:23:01

标签: google-cloud-storage data-transfer

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

  

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

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

3 个答案:

答案 0 :(得分:4)

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

您需要向该用户授予称为“旧版存储区写入器”的权限。

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

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

答案 1 :(得分:0)

由于@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服务帐户。

答案 2 :(得分:0)

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

然后为其分配角色:

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