从 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.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】:除了确保您使用的服务帐户具有适当的权限外,您还需要确保您使用的实例具有访问 Google Cloud Storage 的适当范围,它们通常不是默认的.您可以将范围设置为 Allow full access to all Cloud APIs
或根据需要单独设置它们。您可以找到有关如何操作的说明here。
【讨论】:
这不是我在使用--scopes cloud-platform,storage-full
启动实例时所做的吗?【参考方案2】:
我创建了一个新的服务帐户并执行了完全相同的步骤...现在它可以工作了。
【讨论】:
以上是关于从 GCP 计算实例复制到存储桶时出现 AccessDeniendException的主要内容,如果未能解决你的问题,请参考以下文章
GCP 存储 - 如何创建一个脚本,将所有文件/文件夹从一个存储桶复制到另一个存储桶,但文件夹结构不同
如何仅将目录下许多子目录中的文件复制到 GCP 中的另一个项目存储桶中?