【发布时间】:2019-03-31 21:45:54
【问题描述】:
我正在尝试使用 Java 客户端将数据从 S3 传输到 GCS,但出现此错误。
未能获取 Google Cloud Storage (GCS) 存储分区的位置 ___ 由于权限不足。请验证是否已授予必要的权限。
我正在使用具有项目所有者角色的服务帐户,该帐户应授予对所有项目资源的无限制访问权限。
【问题讨论】:
标签: google-cloud-storage data-transfer
我正在尝试使用 Java 客户端将数据从 S3 传输到 GCS,但出现此错误。
未能获取 Google Cloud Storage (GCS) 存储分区的位置 ___ 由于权限不足。请验证是否已授予必要的权限。
我正在使用具有项目所有者角色的服务帐户,该帐户应授予对所有项目资源的无限制访问权限。
【问题讨论】:
标签: google-cloud-storage data-transfer
Google Transfer Service 正在使用内部服务帐户来回移动数据。此帐户是自动创建的,不应与您自己创建的服务帐户混淆。
您需要为此用户授予名为“旧版存储桶编写器”的权限。
这是写在文档中的,但很容易错过:
https://cloud.google.com/storage-transfer/docs/configure-access
【讨论】:
project-${var.project_number}@storage-transfer-service.iam.gserviceaccount.com
感谢@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}"
}
请注意,这会删除存储桶上存在的 OWNER 和 READER 中的 the default acls。这将阻止您访问控制台中的存储桶。因此,我们将 roles/storage.admin 添加回所有者用户和进行更改的 terraform 服务帐户。
【讨论】:
服务帐号的格式通常为 project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com。要查找您的服务帐户的格式,请使用 googleServiceAccounts.get API 调用。如果找不到,请使用上述约定分配以下角色(为我工作)
然后给它分配角色:
roles/storage.objectViewer
roles/storage.legacyBucketReader
roles/storage.legacyBucketWriter
【讨论】: