【问题标题】:The caller does not have permission when attempting to use Google Cloud Storage within Cloud Run尝试在 Cloud Run 中使用 Google Cloud Storage 时调用者没有权限
【发布时间】:2020-10-10 06:46:17
【问题描述】:

我正在尝试使用 Cloud Storage 在 Google Cloud Run 上设置 Node 项目。我在使用创建的服务帐户时遇到了身份验证问题。

在创建服务帐户时,我确实成功下载了 JSON 令牌,并让所有内容在我的本地开发环境中正常运行。

问题是当我将应用程序成功部署到 Cloud Run 时,我收到以下错误: Error: The caller does not have permission

当我尝试获取用于将文件上传到存储桶的签名 URL 时会发生这种情况。

我这样创建存储客户端:

const { Storage } = require("@google-cloud/storage");
const storage = new Storage();

...在我的脚本中,调用如下:

const [url] = await storage
  .bucket(bucketName)
  .file(filename)
  .getSignedUrl(options);

我已经为 IAM 服务账户设置了以下权限:

  • Cloud SQL 客户端 - 也许相关?我让 Cloud SQL 在已部署的环境中成功运行。
  • 服务帐户用户 - 需要用作服务帐户吗?
  • Storage Object Creator - 我只需要能够从该项目创建签名上传 url。

我还通过控制台将上述服务帐户分配给 Cloud Run 实例。

确认一下,应用程序使用服务帐户 JSON 密钥在本地 100% 正确运行,只是在 Google Cloud 中运行时无法运行。

【问题讨论】:

  • 您确定 Cloud Run 服务已配置为使用您在本地使用的相同服务帐户,而不是默认帐户?
  • @VilleRinne 是的,我已经为创建的非默认帐户指定了“服务帐户”。我可以在修订的详细信息选项卡上看到它。
  • 我不确定这是否有任何相关性。这是我的 Dockerfile 的内容 ` FROM node:alpine WORKDIR /usr/app/src COPY package*.json ./ RUN npm install --production COPY src 。 CMD ["node", "index.js"] `

标签: node.js google-cloud-platform google-cloud-storage google-cloud-run google-cloud-iam


【解决方案1】:

我设法解决了这个问题。看起来当部署到 Cloud Run 中时,它还需要额外的权限“服务帐户令牌创建者”才能运行 getSignedUrl。由于某种原因,在本地不需要此角色。

【讨论】:

  • App Engine 标准环境也是如此。如果您使用默认服务帐户,它将明确需要 IAM 中的“服务帐户令牌创建者”权限。另外请注意,它似乎需要 5 分钟才能生效。
  • 如果有人可以解释如何在 Google Cloud Run 上设置“服务帐户令牌创建者”权限,我将对此表示赞同。我想不通。
  • -打开“console.cloud.google.com/iam-admin/iam”-编辑您的“App Engine 默认服务帐户”-添加新角色“服务帐户令牌创建者”
猜你喜欢
  • 1970-01-01
  • 2021-05-08
  • 2020-09-23
  • 2021-04-14
  • 2022-10-21
  • 2019-09-27
  • 2019-10-25
  • 1970-01-01
  • 2012-11-29
相关资源
最近更新 更多