【问题标题】:AccessDeniedException: 403 when trying to copy file to Google Storage from VM using gsutilAccessDeniedException:尝试使用 gsutil 将文件从 VM 复制到 Google 存储时出现 403
【发布时间】:2018-06-29 00:03:14
【问题描述】:

我正在尝试手动执行自动化流程所需的步骤,以了解其工作原理并确保我能正确理解所有命令。但是当我尝试使用命令时:

gsutil cp file_name gs://bucket_name/

我收到以下错误:

AccessDeniedException: 403 Insufficient OAuth2 scope to perform this operation.

这应该是一件非常简单的事情,但我做不到。我习惯于在 AWS 中执行此操作,但我无法在 Google Cloud 中执行相同操作。有谁知道如何克服它?

【问题讨论】:

    标签: google-cloud-platform google-cloud-storage gsutil


    【解决方案1】:

    您用于尝试复制的帐户似乎没有将对象写入bucket-name 存储桶的权限。

    如果您在 GCE 虚拟机上执行此操作并使用其默认服务帐户,请确保您在创建虚拟机时选择了正确的访问范围 - 默认范围包括对 GCS 的只读访问权限。您可以通过登录 VM 并使用 curl 查询 GCE 元数据服务器来检查这一点:

    $ curl -H 'Metadata-Flavor: Google' "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/scopes"
    [...]
    https://www.googleapis.com/auth/devstorage.read_only
    [...]
    

    【讨论】:

    • 哦,等等,现在我很困惑。这里的问题是我的帐户没有权限还是问题是 GCE VM 没有权限?是的,刚刚检查过,VM 对存储是只读的。
    • 错误消息仅与请求的 oauth 令牌范围有关,该范围通过 VM 的“只读存储”进行控制。如果是帐户权限问题,您会收到类似“'userxyz' does not have 'storage.objects.write' to 'object_name'”这样的错误
    • 我明白了,谢谢。我正在和一位使用 Google Cloud 的朋友交谈,我们发现它想创建一个服务帐户。我将发布一个答案,更多地谈论它。这是某种用户权限,即使 VM 是只读存储,它也可以执行此操作
    【解决方案2】:

    此错误与读/写权限无关,但与分配给您的计算实例的范围有关。换句话说,你需要授予它使用 GCP 资源的权利,你接下来要做的就是特定对象的读/写权限。

    以前需要重新创建实例,但现在停止然后运行以下命令就足够了,例如使用云外壳:

     gcloud compute instances set-service-account myinstance \
         --service-account 192893587797-compute@developer.gserviceaccount.com \
         --scopes cloud-platform
    

    当然替换 myinstance192893587797-compute@developer.gserviceaccount.com 相应地使用您自己的compute instanceservice account name

    【讨论】:

    • FWIW,这对我有用。我一直假设 IAM 优先于范围,但您至少需要这个范围。如果您使用自定义服务帐户,可能带有自定义访问角色,那么您需要小心使用范围以使其正常工作。
    【解决方案3】:

    嘿@Marcus Vinicius Melo,

    我是项目所有者,但仍然面临同样的问题。在我安装 gcs python 包后,它解决了。尝试 pip install google-cloud-storage

    【讨论】:

    • 此答案适用于 FreeBSD 12.2(已完全修补)、gcloud 312.0.0 gsutil 4.53。
    【解决方案4】:

    我和我的一个朋友谈过,他帮我解决了这个问题,这是解决方案:

    我的 GCE 虚拟机对 Google Cloud Storage 具有只读权限。我在网络上发现只有在创建 GCE VM 时才能更改此状态,为了克服这个问题,我需要创建一个新的并删除此 VM。这可行,但我不想放弃我在当前 VM 中所做的一切。

    另一个对我有用的解决方案是创建一个服务帐户(Google Cloud Platform > IAM & admin > Service Accounts)。您只需为其提供所需的服务帐户名称,然后选择“提供新的私钥”。那么你应该很高兴。之后,我可以将文件从 GCE VM 复制到 Storage 并执行我需要的所有其他操作。

    【讨论】:

    • 我是否必须将此密钥提供给我的虚拟机或其他东西?因为只是生成一个新密钥而不做任何其他事情并不能为我解决这个问题。
    • 我现在不太记得了,那是不久前的事了,但你需要将此帐户分配给你的虚拟机或类似的东西
    • 我在删除默认服务帐户然后重新添加后遇到了这个问题。我仍然必须转到服务帐户 - > 操作 - > 创建密钥才能工作(即使它已被授予预期的权限 - 当然,在它可以使用这些权限之前仍然需要密钥)。
    【解决方案5】:

    以下是我解决此问题的方法,可能对这里的新用户有所帮助:

    不删除现有虚拟机的分步流程:

    1. 停止虚拟机实例
    2. 创建一个新的服务帐户IAM & Admin > 服务帐户 > 添加服务帐户
    3. 以 (project > owner ) 的身份创建具有完全权限的新服务帐户
    4. 为此服务帐号创建私钥
    5. 创建新服务帐户后,转到 vm单击其名称 > 然后单击 编辑
    6. 现在,在编辑模式下,向下滚动到 service-accounts 部分并选择新的服务帐户。
    7. 现在,通过浏览器内的 ssh 访问它,一切顺利!
    8. 这是我用来将文件复制到存储桶的命令:sudo gsutil cp FILE_PATH gs://<BUCKET>

    【讨论】:

      【解决方案6】:

      嘿@Marcus Vinicius Melo,您只需要在 GCP 中启用存储传输 API,然后 gsutil 即可完成 GCE 到存储桶。

      【讨论】:

      • 点评来源: 请改进此答案中的解释。也请避免任何非正式。否则,这篇文章似乎没有为问题提供quality answer。请编辑您的答案,或将其作为对问题的评论发布。
      猜你喜欢
      • 2021-03-07
      • 1970-01-01
      • 2020-11-30
      • 2016-08-16
      • 2016-10-25
      • 2020-12-23
      • 2020-08-18
      • 2017-02-12
      • 2023-03-28
      相关资源
      最近更新 更多