gsutil复制从GCE返回“ AccessDeniedException:403权限不足”


90

我通过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”下创建“ logs”)。

我收到的错误消息是:

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

我想念什么?


7
创建的GCE VM具有完全控制权还是读/写GCS范围?
jterrace 2014年

1
感谢您指出这一点。我确实不知道这种选择。我重新创建了启用了该选项的实例,它可以正常工作。如果您建议打开标志作为答案,我会很乐意将其标记。
Christophe

Answers:


131

要寻找的另一件事是,确保在创建GCE VM时设置适当的范围。即使VM附加了服务帐户,也必须为其分配开发范围以访问GCS。

例如,如果您使用devstorage.read_only范围创建了VM ,即使您的服务帐户有权写入存储桶,尝试写入存储桶也会失败。您将需要devstorage.full_controldevstorage.read_write

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

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

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


1
我使用权限重新创建了实例,现在所有实例都可以使用。感谢
Syclone '16

33
到目前为止,您可以编辑范围。停止机器-编辑-然后更改Cloud API访问范围。我相信现在只能使用一个月左右。
沃伦

143
向VM添加必要的作用域后,gsutil可能仍在使用没有新作用域的缓存凭据。gsutil再次尝试命令之前,请删除〜/ .gsutil 。
mndrix '16

2
非常感谢你mndrix!
吉列尔莫

2
@mndrix挽救了一天
Ben Guild

50

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

gcloud auth login

1
gcloud auth revoke <email-account>完成后不要忘记签发。
ssasa

50

gsutil config -b

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

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


请注意,如果您gsutil从运行,这是行不通的ssh
bfontaine

3
如果没有打开浏览器,它“不起作用”。相反,它提供了一个URL供您手动复制和粘贴。
BuvinJ

6
如果您放下,-b这对其他所有人也适用。那将不会打开浏览器,而只会吐出一个可以在Shell外部打开的URL。
oligofren

8

由于无法发表评论,因此我已为该问题写了答案:

如果在某些情况下运行gsutil带有sudo前缀的命令,也会发生此错误。


3
这实际上是评论,而不是答案。有了更多代表,您就可以发表评论
莱斯

1
我给出了答案(+1),以便@TheLoneDeranger的声誉将更接近“发表评论”特权。
Rann Lifshitz

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



2

因此,我尝试了一堆尝试将其从GCS存储桶复制到我的VM的事情。希望这篇文章对某人有所帮助。

通过SSHed连接: 在此处输入图片说明

并遵循以下脚本:

sudo gsutil cp gs://[BUCKET_NAME]/[OBJECT_NAME] [OBJECT_DESTINATION_IN_LOCAL]

得到这个错误:

AccessDeniedException:403未配置访问。请转到您项目的Google Cloud Platform控制台(https://cloud.google.com/console#/project),选择API和Auth并启用Google Cloud Storage JSON API。

解决此链接中提到的“激活API”部分之后的问题的解决方法-https: //cloud.google.com/storage/docs/json_api/

在此处输入图片说明

激活API后,我将通过SSHed窗口对自己进行身份验证

gcloud auth login

经过身份验证过程,我终于能够从Google存储桶下载到我的VM。

聚苯乙烯

我确实确保:

  1. 确保在我的VM实例上安装了gsutils。
  2. 转到我的存储桶,转到权限选项卡,然后添加所需的服务帐户并设置Storage Admin权限/角色。 在此处输入图片说明

    3.确保我的VM具有适当的Cloud API访问范围: 在此处输入图片说明

在此处输入图片说明


1

从文档中:https//cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscopes

您需要先停止实例->转到编辑页面->转到“ Cloud API访问范围”,然后选择“存储完全访问权限或读取/写入或所需的内容”

更改实例的服务帐户和访问范围如果要以其他身份运行VM,或者确定实例需要一组不同的范围来调用所需的API,则可以更改服务帐户和访问范围现有实例的实例。例如,您可以更改访问范围以授予对新API的访问权限,或更改实例以使其作为您创建的服务帐户(而不是Compute Engine默认服务帐户)运行。

要更改实例的服务帐户和访问范围,必须暂时停止该实例。要停止实例,请阅读有关停止实例的文档。更改服务帐户或访问范围之后,请记住重新启动实例。使用以下方法之一更改已停止实例的服务帐户或访问范围。


0

更改存储桶的权限。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.