我正在尝试使用Java客户端将数据从S3传输到GCS,但出现此错误。
无法获取Google Cloud Storage(GCS)存储桶的位置 ___由于权限不足。请验证是否已授予必要的权限。
我正在使用具有“项目所有者”角色的服务帐户,该帐户应无限制地访问所有项目资源。
答案 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}"
}
请注意,这会删除存储桶中OWNER
和READER
中的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