从 GCP 计算实例复制到存储桶时出现 AccessDeniendException

Posted

技术标签:

【中文标题】从 GCP 计算实例复制到存储桶时出现 AccessDeniendException【英文标题】:AccessDeniendException on copying from GCP Compute instance to Storage bucket 【发布时间】:2019-09-24 03:50:27 【问题描述】:

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

我已激活 necessary permissions 以在 Compute 实例上使用服务帐户(详情如下),但是当我尝试将 gsutil cp 文件放入存储桶时,我得到了 AccessDeniedException。 错误消息抱怨缺少 storage.object.createstorage.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 &lt;key&gt;.json 验证帐户。

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

【问题讨论】:

您是否在更改服务帐户后重新启动实例? 【参考方案1】:

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

【讨论】:

这不是我在使用--scopes cloud-platform,storage-full 启动实例时所做的吗?【参考方案2】:

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

【讨论】:

以上是关于从 GCP 计算实例复制到存储桶时出现 AccessDeniendException的主要内容,如果未能解决你的问题,请参考以下文章

GCP 存储 - 如何创建一个脚本,将所有文件/文件夹从一个存储桶复制到另一个存储桶,但文件夹结构不同

cloud/gsutil 将文件从实例复制到存储桶

尝试从 aws ec2 客户端访问存储桶时出现位置约束异常

如何仅将目录下许多子目录中的文件复制到 GCP 中的另一个项目存储桶中?

使用 kops 在 gcp 上验证集群时出现 TLS 握手超时错误

云存储 - 从 PVC 复制到存储桶