谷歌云从存储桶部署静态应用程序而不使用本地机器
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的权限有两种方式:
-
使用谷歌云控制台:
-
使用 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
【讨论】:
以上是关于谷歌云从存储桶部署静态应用程序而不使用本地机器的主要内容,如果未能解决你的问题,请参考以下文章