从GCP计算实例复制到存储分区的AccessDeniendException

时间:2019-05-06 13:37:00

标签: google-cloud-platform permissions google-cloud-storage service-accounts gsutil

我想使用gsutil cp将对象从Google Compute Engine实例复制到Google存储桶。两者都属于同一所有者(我)和同一项目。我想使整个机器自动化,所以手动验证不是我想要的。

我已经激活necessary permissions以便在Compute实例上使用服务帐户(详细信息如下),但是当我尝试将文件gsutil cp存储到存储桶时,我得到了AccessDeniedException
错误消息抱怨缺少storage.object.createstorage.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>
  • 在某些时候启用了存储桶级IAM策略,而不是按对象策略(出于安全考虑)。
  • 在实例上,使用 gcloud auth activate-service-account --key-file <key>.json对帐户进行身份验证。

但是,无论如何,我的错误不会改变,并且无法写入存储桶。我可以,但是,从存储桶中读取文件。在使用服务帐户的本地计算机上,我也遇到同样的错误,因此问题与实例无关。

2 个答案:

答案 0 :(得分:0)

除了确保您使用的服务帐户具有适当的权限外,还需要确保您使用的实例具有适当的范围来访问Google Cloud Storage(通常它们不是默认范围) 。您可以将范围设置为Allow full access to all Cloud APIs,也可以根据需要单独设置。您可以找到有关如何操作的说明here

答案 1 :(得分:0)

我创建了一个新的服务帐户并执行了完全相同的步骤...现在可以使用了。