【发布时间】: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