首页 > 解决方案 > 如何从 Cloud Run 上的 Docker 应用向 Cloud Storage 进行身份验证

问题描述

我在尝试部署到 Google Cloud Run 的 Docker 容器中有一个 Node.js 应用程序。

我希望我的应用程序能够从位于同一项目下的 GCS 存储桶中读取/写入文件,但我无法在它周围找到太多信息。

这是我迄今为止尝试过的:

1. 希望它开箱即用

也就是在没有凭据的情况下进行初始化,就像在 App Engine 中一样。

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

// ...later in an async function

const storage = new Storage();

// This line throws the exception below
const [file] = await storage.bucket('mybucket')
  .file('myfile.txt')
  .download()

最后一行抛出这个异常

{ Error: Could not refresh access token: Unsuccessful response status code. Request failed with status code 500"
    at Gaxios._request (/server/node_modules/gaxios/build/src/gaxios.js:85:23)

2. 希望在将 Storage Admin IAM 角色设置为我的 Cloud Run 服务帐户后,它可以开箱即用。

没有。和以前没有区别。

3. 复制我的凭证文件作为一个cloudbuild.yaml步骤:

...
- name: 'gcr.io/cloud-builders/gsutil'
    args: ['cp', 'gs://top-secret-bucket/gcloud-prod-credentials.json', '/www/gcloud-prod-credentials.json']
...

它可以很好地复制文件,但是从我的应用程序中也看不到该文件。我仍然不确定它到底被复制到了哪里,但是/www从我的应用程序中列出目录并没有显示任何痕迹。

4. 将我的凭证文件复制为 Docker 步骤

等等,但为此我需要进行身份验证gsutil,为此我需要凭据。

所以...

如果不将凭据文件上传到版本控制,我有哪些选择?

标签: dockergoogle-cloud-storagegoogle-cloud-rungoogle-container-registry

解决方案


这就是我设法使它工作的方法:

  • 初始化客户端库的代码是正确的。与原始问题相比,这里没有任何变化。如果 GCS 存储桶与您的 Cloud Run 服务属于同一项目,则您无需加载任何凭据。
  • 我了解到服务帐户[myprojectid]-compute@developer.gserviceaccount.com(又名“Compute Engine 默认服务帐户”)是默认用于运行 Cloud Run 服务的帐户,除非您指定其他帐户。
  • 我去了服务帐户页面并确保启用了提到的服务帐户(我的没有,这是我所缺少的)。
  • 然后我去了这里,编辑了提到的服务帐户的权限并添加了存储对象管理员角色。

有关本文的更多信息:https ://cloud.google.com/run/docs/securing/service-identity


推荐阅读