docker - 如何从 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
,为此我需要凭据。
所以...
如果不将凭据文件上传到版本控制,我有哪些选择?
解决方案
这就是我设法使它工作的方法:
- 初始化客户端库的代码是正确的。与原始问题相比,这里没有任何变化。如果 GCS 存储桶与您的 Cloud Run 服务属于同一项目,则您无需加载任何凭据。
- 我了解到服务帐户
[myprojectid]-compute@developer.gserviceaccount.com
(又名“Compute Engine 默认服务帐户”)是默认用于运行 Cloud Run 服务的帐户,除非您指定其他帐户。 - 我去了服务帐户页面并确保启用了提到的服务帐户(我的没有,这是我所缺少的)。
- 然后我去了这里,编辑了提到的服务帐户的权限并添加了存储对象管理员角色。
有关本文的更多信息:https ://cloud.google.com/run/docs/securing/service-identity
推荐阅读
- reactjs - React、console.log 和 render 显示不同的值
- database - Gorm 更改列长
- php - Mysql - php_network_getaddresses:getaddrinfo 失败:名称或服务未知
- python - PyTorch:PyTorch 中的 numpy.linalg.multi_dot() 等价物是什么
- python - Odoo 14:在树视图中添加部分功能
- android - 在颤振中在android中实现人脸ID
- javascript - 事件侦听器仅附加到循环中的最后一个条目
- javascript - React-router-dom:History.push 连接路径并且不会重新路由应用程序
- java - 无法在 Android Studio 中访问 XML 表单主活动
- javascript - 使用 xlsx 数据创建网络。html 的