谷歌云从存储桶部署静态应用程序而不使用本地机器

Posted

技术标签:

【中文标题】谷歌云从存储桶部署静态应用程序而不使用本地机器【英文标题】:Google cloud deploy static app from bucket without using local machine 【发布时间】:2021-11-13 09:49:56 【问题描述】:

我在谷歌云构建中有一个自动构建管道:

- name: "gcr.io/cloud-builders/gsutil"
  entrypoint: gsutil
  args: ["-m","rsync","-r","gs://my-bucket-main","gs://my-bucket-destination"]

我授予以下权限

xxxxxx@cloudbuild.gserviceaccount.com

Cloud Build Service Account
Cloud Functions Developer
Service Account User
Storage Admin
Storage Object Admin

但我得到: 列出 gs://my-bucket-destination/ 时捕获不可重试异常:AccessDeniedException: 403 xxxxx@cloudbuild.gserviceaccount.com 没有 storage.objects.list 对 Google Cloud Storage 存储桶的访问权限。

即使我将权限所有者添加到 xxxxxx@cloudbuild.gserviceaccount.com 我也会收到相同的错误。我不明白 Storage Admin 和 Storage Object Admin 怎么可能不提供 storage.object.list 访问权限!

即使我在 gcloud 指向项目的本地机器上执行此操作并且我使用 gsutil -m rsync -r gs://my-bucket-main gs://my-bucket-destination 仍然得到:

Caught non-retryable exception while listing gs://my-bucket-destination/: AccessDeniedException: 403 XXXXX@YYYY.com does not have storage.objects.list access to the Google Cloud Storage bucket.

XXXXX@YYYY.com 帐户是所有者,我还给了“存储管理员”和 “存储对象管理员”也可以访问它

有什么想法吗?

【问题讨论】:

错误信息告诉你云构建服务账号没有权限。现在你需要弄清楚为什么当你认为它没有权限时它没有权限。 1) 转到 Google Cloud GUI 并仔细检查您是否已将正确的角色添加到正确项目中的正确服务帐户。 2) 仔细检查您是否没有拼错存储桶名称。如果您指定的存储桶不属于您的项目(由另一个项目拥有),您将收到该权限错误。 你好约翰,谢谢,但我在上面的文字中写道,我给予了所有许可,显然是我正在工作的当前项目。我不知道为什么它不起作用。即使我的机器作为所有者,通过运行上面的代码,我也会得到同样的错误。除了成为所有者之外,我将 Storage Admin Storage Object Admin 添加到我的帐户,但仍然出现相同的错误 【参考方案1】:

服务帐户正在创建该错误。我的建议是在存储桶级别为您的服务帐号设置正确的 IAM 角色。

在两个bucket上设置service account的权限有两种方式:

    使用谷歌云控制台:
转到云存储Browser 页面。 点击与存储桶关联的行最右侧的存储桶溢出菜单。 选择编辑存储桶权限。 点击+添加成员按钮。 在新成员字段中,输入一个或多个需要访问您的存储桶的身份。 从选择角色下拉菜单中选择一个(或多个角色)。您选择的角色将显示在窗格中,并附有他们授予的权限的简短说明。您可以选择Storage Admin角色来完全控制存储桶。 点击保存
    使用 gsutil 命令:
gsutil iam ch serviceAccount:xxxxx@cloudbuild.gserviceaccount.com:objectAdmin gs://my-bucket-main

gsutil iam ch serviceAccount:xxxxx@cloudbuild.gserviceaccount.com:objectAdmin gs://my-bucket-destination

如需完整的 gsutil 命令 文档,您可以参考这里:Using IAM with buckets

【讨论】:

以上是关于谷歌云从存储桶部署静态应用程序而不使用本地机器的主要内容,如果未能解决你的问题,请参考以下文章

从谷歌云存储获取状态 503

使用 SSIS 将本地文件上传到谷歌云存储桶

使用带有自定义域的私有谷歌云存储

如何在谷歌 vm 存储桶服务器中提供静态文件?

如何从 acl 控件禁用谷歌云存储桶列表?

谷歌云存储:401 未经授权的错误