我想使用 将对象从 GCP Compute 实例复制到 Google Storage Bucket gsutil cp
。两者都属于同一所有者(我)和同一项目。我想自动化整个机器,因此手动验证不是我想要的。
我已经激活了必要的权限在 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
来验证账户。
但是,无论我做什么,错误都不会改变,而且我无法写入存储桶。我能但是,从存储桶中读取文件。
目前,我只是在浪费钱试图让它工作。
答案1
我创建了一个新的服务帐户并执行了完全相同的步骤...现在它可以正常工作了。