可恢复上传中止异常:403权限不足。

39

我正在使用Google Cloud Storage和Google Compute Engine,并尝试从我的虚拟机上传到我的存储桶。我的存储桶具有读/写权限,任何有访问权限的人都可以这样做。他们被标记为所有者。我可以成功地从我的存储桶下载文件。但是当我尝试上传文件到存储桶时,我遇到了以下错误:ResumableUploadAbortException: 403 Insufficient Permission. 我不确定为什么会出现这种情况?有什么提示吗?

7个回答

123

将虚拟机的云API访问范围更改为允许在存储上进行读/写操作。这个设置在虚拟机设置的“访问范围”部分。需要停止虚拟机才能执行此操作。

0. Stop VM instance
1. Open VM instance details
2. Press "Edit"
3. Change Cloud API access scope--> "Allow full access to all cloud APIs"

....

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

重要提示!请注意此评论中提到的相关帖子,可能需要在定义新范围后删除~/.gsutil中的凭据。

# VM instance console
sudo rm -r ~/.gsutil

14
TILT:rm -rf ~/.gsutil - Rondo
除此之外,您需要确保服务帐户可以在存储桶中创建对象。您可以通过进入存储桶,点击权限并添加具有存储对象创建者角色的服务帐户电子邮件来完成此操作。 - foges
请注意,当前版本的文档建议选择“允许对所有云API进行完全访问”,但也可以选择“为每个API设置访问权限”,然后继续选择存储组合框并将其设置为完全访问 - manasouza
这个方法很管用

VM实例控制台

sudo rm -r ~/.gsutil
- rbyndoor
在我的情况下,我使用了sudo gsutil命令,因此它使用了另一个用户,并且直到我移除了sudo才上传成功。 - Yaro

14
在GCE实例上运行以下命令进行设置:无需重新启动Compute Engine。
gcloud init

输出结果将会类似于这样。

Choose the account you would like to use to perform operations for  this configuration:
 [1] 533893300998-compute@developer.gserviceaccount.com
 [2] Log in with a new account
Please enter your numeric choice: 1

选择数字1以使用服务账号。如果这是共享的计算机,并且您使用个人帐户登录,则其他任何人都可以使用您的凭据。

有关详细信息请阅读此处

如果您已经初始化了gcloud,则不需要重新初始化。

gcloud auth login 

3
如果您不想重新启动虚拟机,这是一个好的、可用的答案。 - philshem

5
你是否正在使用虚拟机上的默认服务账户访问存储桶?该账户默认只有读取权限。试着创建一个带有读写权限的虚拟机。

我需要重新创建一个虚拟机实例吗?我的应用程序被编程指向当前虚拟机的IP地址。如果我创建一个新的虚拟机实例,我将被分配一个新的IP地址。有没有办法在不这样做的情况下给我的帐户写入权限? - superuserdo
我认为没有任何方法可以更改正在运行的实例的权限。如果您需要特定的IP地址保持不变,我建议您预留一个静态IP地址:https://cloud.google.com/compute/docs/instances-and-network#reservedaddress - Travis Hobrla

4
您需要为实例的服务帐户授予在存储桶中创建对象的权限。尽管其他答案可以实现此操作,但可能会开放比您需要的更多的权限。以下是如何仅添加单个附加权限的方法:
  1. 获取您的服务帐户的电子邮件地址:
$ gcloud auth list
                  Credentialed Accounts
ACTIVE  ACCOUNT
*       123456789-compute@developer.gserviceaccount.com
  1. 在云控制台中打开您的存储桶并进入“权限”选项卡
  2. 点击“添加成员”
  3. 粘贴上述服务账号的电子邮件地址
  4. 在“角色”下拉菜单中选择“存储对象管理员”
    • 注意:这将赋予创建、列出和删除对象的权限。如果您只需要创建对象,可以尝试使用“存储对象创建者”。
  5. 点击“保存”

请注意,这将赋予所有共享同一服务账号的实例相同的权限。如果您需要更细粒度的访问控制,应为每个实例创建不同的服务账号。

完成这些步骤后,您需要像其他人所说的那样重新加载权限。

rm -rf ~/.gsutil
rm -rf /root/.gsutil

你是摇滚明星! - Bira

3

如果可以的话,让我用更简单的步骤来解释一下:

  1. 从控制台停止虚拟机,编辑访问控制并将"存储"权限从"读取"更改为"写入"或"完全控制"。
  2. 启动虚拟机
  3. 在命令行中清除缓存

    rm -r ~/.gsutil

这样应该就可以了。


2

当与其他云平台产品(例如Google Cloud Storage(存储桶))以非交互方式进行交互时,例如从VM实例,建议使用作用域,这反过来利用服务帐户,这是验证VM /系统的首选方式。有关更多信息,请单击此处


0

如果您来到这里是为了在Windows上进行类似的操作,除了Daniel's answer之外,请在重新启动实例后按照以下步骤操作。

登录并以管理员权限进入cmd行,并执行以下操作

rmdir /s /q C:\users\<your-login-account>\.gsutil

跟随着

gcloud init 

这将指导您通过新特权重新初始化您的帐户 输入图像描述

基本上选择1,然后在下一步中再次选择1,就可以完成设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接