Google cloud storage “gsutil副本返回”;AccessDeniedException:403权限不足“;来自GCE

Google cloud storage “gsutil副本返回”;AccessDeniedException:403权限不足“;来自GCE,google-cloud-storage,Google Cloud Storage,我通过SSH登录到GCE实例。在此,我希望通过服务帐户访问存储: GCE> gcloud auth list Credentialed accounts: - 1234567890-compute@developer.gserviceaccount.com (active) 我首先确保这个服务帐户在我工作的项目的权限中被标记为“可以编辑”。我还确保给他桶上的写ACL我希望他复制一个文件: local> gsutil acl ch -u 1234567890-compute@dev

我通过SSH登录到GCE实例。在此,我希望通过服务帐户访问存储:

GCE> gcloud auth list
Credentialed accounts:
 - 1234567890-compute@developer.gserviceaccount.com (active)
我首先确保这个服务帐户在我工作的项目的权限中被标记为“可以编辑”。我还确保给他桶上的写ACL我希望他复制一个文件:

local> gsutil acl ch -u 1234567890-compute@developer.gserviceaccount.com:W gs://mybucket
但随后以下命令失败:

GCE> gsutil cp test.txt gs://mybucket/logs
(我还确保在“mybucket”下创建“日志”)

我收到的错误消息是:

Copying file://test.txt [Content-Type=text/plain]...
AccessDeniedException: 403 Insufficient Permission               0 B  

我遗漏了什么?

另一件需要注意的事情是确保在创建GCE VM时设置了适当的作用域。即使虚拟机连接了服务帐户,也必须为其分配devstorage作用域才能访问GCS

例如,如果您使用
devstorage.read only
作用域创建了VM,则尝试写入存储桶将失败,即使您的服务帐户具有写入存储桶的权限。您需要
devstorage.full\u control
devstorage.read\u write

有关详细信息,请参阅上的部分

注意:默认计算服务帐户的作用域非常有限(包括对GCS的只读)。这是因为默认服务帐户具有Project Editor IAM权限。如果您使用任何用户服务帐户,这通常不是问题,因为默认情况下,用户创建的服务帐户可以访问所有范围


在向VM添加必要的作用域后,
gsutil
可能仍在使用没有新作用域的缓存凭据。再次尝试gsutil命令之前,请删除
~/.gsutil
。(感谢@mndrix在评论中指出这一点。)

gsutil config-b

然后浏览到它提供的URL, [单击允许]


然后复制验证码并粘贴到终端。

您必须使用具有该项目所需权限的帐户登录:

gcloud auth login
由于我无法发表评论,我已就此问题写了答复:

在某些情况下,如果使用
sudo
前缀运行
gsutil
命令,也可能发生此错误

  • 创建存储桶后,转到“权限”选项卡,添加电子邮件并设置存储管理权限
  • 通过SSH>>运行命令访问VM实例:
    gcloud auth login
    ,然后按照以下步骤操作
  • 参考:

    来自文档:

    您需要首先停止实例->转到编辑页面->转到“云API访问范围”,然后选择“存储完全访问或读/写或任何您需要的内容”

    如果需要,请更改实例的服务帐户和访问范围 要以不同的身份运行VM,或者您确定 实例需要一组不同的作用域来调用所需的API, 您可以更改服务器的服务帐户和访问范围 现有实例。例如,您可以将访问范围更改为授予 访问新API,或更改实例以使其作为 您创建的服务帐户,而不是计算引擎 默认服务帐户

    要更改实例的服务帐户和访问范围 实例必须临时停止。要停止实例,请阅读 用于停止实例的文档。更换服务后 帐户或访问范围,请记住重新启动实例。使用其中一个 使用以下方法更改服务帐户或访问范围 已停止实例的


    所以我尝试了很多方法试图从GCS存储桶复制到我的虚拟机。 希望这篇文章能帮助别人

    通过SSHed连接:

    按照这个脚本:

    sudo gsutil cp gs://[BUCKET_NAME]/[OBJECT_NAME] [OBJECT_DESTINATION_IN_LOCAL]
    
    出现以下错误:

    AccessDeniedException:403未配置访问。请转到项目的Google云平台控制台(),选择API和Auth并启用Google云存储JSON API

    在这个链接中提到的“激活API”部分之后,修复了这个问题-

    一旦我激活了API,我就在SSHed窗口中通过

    gcloud auth login
    
    经过认证过程,我终于能够从谷歌存储桶下载到我的虚拟机上

    PS

    我确实确保:

  • 确保在我的VM实例上安装了GSUTIL
  • 转到“我的存储桶”,转到“权限”选项卡,添加所需的服务帐户,并设置存储管理员权限/角色。

    3.确保我的虚拟机具有正确的云API访问范围:

  • 停止虚拟机
  • 已获取-->VM实例详细信息
  • 在“云API访问范围”中选择“允许完全访问所有云API”,然后 单击“保存”
  • 重新启动VM并删除~/.gsutil
    更改bucket的权限

    为“所有用户”添加一个用户,并授予“存储管理员”访问权限


    GCE虚拟机是在完全控制或读/写GCS范围内创建的?感谢您指出这一点。我确实没有意识到这一选择。我在启用该选项的情况下重新创建了该实例,它成功了。如果你能建议打开这个标志作为答案,我会很高兴地将它标记出来。我用权限重新创建了我的实例,现在一切都正常了。现在,您可以编辑范围了。停止机器-编辑-然后更改云API访问范围。我相信这只提供了大约一个月。在向VM添加了必要的作用域之后,
    gsutil
    可能仍然在使用没有新作用域的缓存凭据。再次尝试
    gsutil
    命令之前,请删除~/.gsutil。非常感谢您@mndrix保存dayNote如果您从
    ssh
    运行
    gsutil
    ,则此选项不起作用。它“不起作用”,甚至无法打开浏览器。相反,它提供了一个url供您手动复制和粘贴。如果您删除
    -b
    ,这也适用于其他所有人。这将不会打开浏览器,但会打开浏览器