【发布时间】:2019-09-24 03:50:27
【问题描述】:
我想使用 gsutil cp 将对象从 Google Compute Engine 实例复制到 Google 存储桶。两者都属于同一个所有者(我)和同一个项目。我想自动化整台机器,所以手动验证不是我想要的。
我已激活 necessary permissions 以在 Compute 实例上使用服务帐户(详情如下),但是当我尝试将 gsutil cp 文件放入存储桶时,我得到了 AccessDeniedException。
错误消息抱怨缺少 storage.object.create 或 storage.object.list 权限,具体取决于我的存储桶目标路径是否以文件夹 (gs://<bucket>/test/) 或文件 (gs://<bucket>/test.txt) 结尾。
我为获得权限所做的工作(我已经尝试了很多,包括创建我还分配给服务帐户的冗余自定义角色):
- 启动实例:
gcloud instances create <instance> [...] \
--service--account <name>@<project>.iam.gserviceaccount.com \
--scopes cloud-platform,storage-full
- 授予服务帐户创建权限。
- 之后也授予服务帐户权限(为了安全起见):
gcloud projects add-iam-policy-binding <project> \
--member serviceAccount:<name>@<project>.iam.gserviceaccount.com \
--role roles/storage.objectAdmin
- 编辑服务帐号的存储分区权限:
gsutil iam ch \
serviceAccount:<name>@<project>.iam.gserviceaccount.com:roles/storage.objectAdmin \
gs://<bucket>
- 编辑存储桶访问控制列表(所有者权限):
gsutil acl ch -u <name>@<project>.iam.gserviceaccount.com:O gs://<bucket>
- 在某些时候启用了存储桶级别的 IAM 策略,而不是每个对象的策略(为了安全起见)。
- 在实例上,使用
gcloud auth activate-service-account --key-file <key>.json验证帐户。
但是,无论我做什么,错误都不会改变,我无法写入存储桶。但是,我可以从存储桶中读取文件。我在使用服务帐户的本地计算机上也遇到了同样的错误,因此问题与实例无关。
【问题讨论】:
-
您是否在更改服务帐户后重新启动实例?
标签: google-cloud-platform permissions google-cloud-storage service-accounts gsutil