gsutil从GCE返回"AccessDeniedException:403 Notufficient Permission"

Chr*_*phe 78 google-cloud-storage

我通过SSH登录到GCE实例.从那里我想借助服务帐户访问存储:

GCE> gcloud auth list
Credentialed accounts:
 - 1234567890-compute@developer.gserviceaccount.com (active)
Run Code Online (Sandbox Code Playgroud)

我首先确保此服务帐户在我正在处理的项目的权限中被标记为"可以编辑".我还确保在存储桶上写入ACL,我希望他复制文件:

local> gsutil acl ch -u 1234567890-compute@developer.gserviceaccount.com:W gs://mybucket
Run Code Online (Sandbox Code Playgroud)

但是以下命令失败:

GCE> gsutil cp test.txt gs://mybucket/logs
Run Code Online (Sandbox Code Playgroud)

(我还确保在"mybucket"下创建"logs").

我得到的错误信息是:

Copying file://test.txt [Content-Type=text/plain]...
AccessDeniedException: 403 Insufficient Permission               0 B  
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

jte*_*ace 102

另一个需要注意的是确保在创建GCE VM时设置适当的范围.即使VM附加了服务帐户,也必须为其分配devstorage范围才能访问GCS.

例如,如果您使用devstorage.read_only作用域创建了VM ,则即使您的服务帐户具有写入存储桶的权限,尝试写入存储桶也会失败.你需要devstorage.full_controldevstorage.read_write.

有关详细信息,请参阅准备实例以使用服务帐户一节.

  • 在向VM添加必要的作用域之后,`gsutil`可能仍在使用没有新作用域的高速缓存凭据.在再次尝试`gsutil`命令之前删除〜/ .gsutil. (121认同)
  • 截至目前,您可以编辑范围.停止计算机 - 编辑 - 然后更改Cloud API访问范围.我相信现在只有一个月了. (30认同)
  • 我怎么能为已经运行的实例做到这一点? (2认同)
  • 非常感谢 mndrix! (2认同)
  • @mndrix 拯救了这一天 (2认同)

小智 42

gsutil config -b

然后浏览它提供的URL, [CLICK Allow]

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

  • 这适用于在浏览器中使用控制台的人.-2017 (5认同)
  • 如果您放下`-b`_,这对其他所有人也都适用。那将不会打开浏览器,而只会吐出一个可以在Shell外部打开的URL。 (4认同)
  • 如果不打开浏览器,它“不起作用”。相反,它提供了一个URL供您手动复制和粘贴。 (2认同)

Jav*_*ini 38

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

gcloud auth login
Run Code Online (Sandbox Code Playgroud)

  • 完成后不要忘记发出`gcloud auth revoke <email-account>`。 (3认同)

小智 14

  1. 停止虚拟机
  2. 得到 --> VM 实例详细信息。
  3. 在“云 API 访问范围”中选择“允许完全访问所有云 API”,然后单击“保存”。
  4. 重新启动 VM 并删除 ~/.gsutil 。

Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这个在 2022 年 2 月 2 日对我来说非常有效。看起来是最好的最新答案。 (4认同)
  • 您需要在编辑任何权限之前停止实例 (2认同)

The*_*ger 8

我已经写了这个问题的答案,因为我不能发表评论:

如果在某些情况下运行gsutilsudo前缀的命令,也会发生此错误.

  • 这真是一个评论,而不是答案.有了更多的代表,[你将能够发表评论](// stackoverflow.com/privileges/comment). (3认同)