尝试在 Cloud Run 中使用 Google Cloud Storage 时调用方没有权限

Joh*_*ing 4 node.js google-cloud-storage google-cloud-platform google-cloud-iam google-cloud-run

我正在尝试使用 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();
Run Code Online (Sandbox Code Playgroud)

...在我的脚本中,调用是这样的:

const [url] = await storage
  .bucket(bucketName)
  .file(filename)
  .getSignedUrl(options);
Run Code Online (Sandbox Code Playgroud)

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

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

我还通过控制台将提到的服务帐户分配给了 Cloud Run 实例。

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

Joh*_*ing 11

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

  • - 打开“https://console.cloud.google.com/iam-admin/iam” - 编辑“App Engine 默认服务帐户” - 添加新角色“服务帐户令牌创建者” (4认同)
  • App Engine 标准环境也是如此。如果您使用默认服务帐户,则它将明确需要 IAM 中的“服务帐户令牌创建者”权限。另请注意,似乎需要 5 分钟才能生效。 (3认同)