AccessDeniedException:尝试使用 gsutil 从 VM 将文件复制到 Google 存储时出现 403

AccessDeniedException: 403 when trying to copy file to Google Storage from VM using gsutil

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

gsutil cp file_name gs://bucket_name/

我收到以下错误:

AccessDeniedException: 403 Insufficient OAuth2 scope to perform this operation.

本来应该是很简单的事情,但是我做不对。我习惯在 AWS 中这样做,但我无法在 Google Cloud 中做同样的事情。任何人都知道如何克服它?

您用来尝试进行此复制的帐户似乎无权将对象写入 bucket-name 存储桶。

如果您在 GCE VM 上执行此操作并使用其默认服务帐户,请确保您在创建 VM 时选择了正确的访问范围——默认范围包括对 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 对 Google 云存储具有只读权限。我在网上发现,您只能在创建 GCE VM 时更改此状态,为了克服这个问题,我需要创建一个新的并删除此 VM。那会起作用,但我不想放弃我在当前 VM 中所做的一切。

另一个对我有用的解决方案是创建一个服务帐户(Google Cloud Platform > IAM & admin > Service Accounts)。你只需要给它你想要的服务帐户名称,然后 select 'Furnish a new private key'。那么你应该可以开始了。之后,我可以将文件从 GCE VM 复制到存储并执行我需要的所有其他操作。

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

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

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

 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

嘿@Marcus Vinicius Melo,

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

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

不删除现有 VM 的分步过程:

  1. 停止 VM 实例
  2. 创建新服务帐户 IAM 和管理 > 服务帐户 > 添加服务帐户
  3. 创建一个具有完整权限的新服务帐户 (project > owner )
  4. 为此服务帐户
  5. 创建私钥
  6. 创建新服务帐户后,转到 vm单击它的名称 > 然后单击 编辑
  7. 现在,在编辑模式下,向下滚动到 service-accounts 部分和 select 新服务帐户。
  8. 现在,通过浏览器中的 ssh 访问它,您就可以开始了!
  9. 这是我用来将文件复制到存储桶的命令:sudo gsutil cp FILE_PATH gs://<BUCKET>