我想使用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
)中结束。
我为获得权限所做的事情(我已经尝试了 lot ,包括创建冗余的自定义角色,这些角色也已分配给服务帐户):
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>
gcloud auth activate-service-account --key-file <key>.json
对帐户进行身份验证。但是,无论如何,我的错误不会改变,并且无法写入存储桶。我可以,但是,从存储桶中读取文件。在使用服务帐户的本地计算机上,我也遇到同样的错误,因此问题与实例无关。
答案 0 :(得分:0)
除了确保您使用的服务帐户具有适当的权限外,还需要确保您使用的实例具有适当的范围来访问Google Cloud Storage(通常它们不是默认范围) 。您可以将范围设置为Allow full access to all Cloud APIs
,也可以根据需要单独设置。您可以找到有关如何操作的说明here。
答案 1 :(得分:0)
我创建了一个新的服务帐户并执行了完全相同的步骤...现在可以使用了。