docker - 使用用户凭据在 Cloud Run 中对 gcloud SDK 进行身份验证
问题描述
我目前正在开发一个项目,该项目将自动设置一个新的 Firebase/Gcloud 项目。它严重依赖Firebase CLI和带有用户凭据的gcloud SDK来执行几个强制性步骤。
我现在正在尝试将此项目移动到 Cloud Run 上的 Docker 容器。我已经能够使用内置的基于令牌的 CI 命令使用用户凭据对 Firebase CLI 进行身份验证。
我想问一下是否可以使用类似的方法对 gcloud SDK 进行身份验证。
为什么服务帐户可能不起作用
我意识到像这样的服务到服务程序应该使用服务帐户进行身份验证。然而,就我而言,程序的流程是这样的:
- 使用 Firebase CLI 创建新的 gcloud/firebase 项目
- 使用 gcloud SDK 为新项目添加 IAM 绑定、启用 API、计费等
我无法使用服务帐户对步骤 2 中的请求进行身份验证,因为项目刚刚创建,因此我还没有机会授予任何服务帐户编辑或下载密钥文件的权限。这就是为什么我想使用代表用户凭据的令牌进行身份验证。
默认情况下,Cloud Run 环境实际上有权访问托管容器的项目的服务帐号。由于此服务帐户无权编辑新创建的项目,因此使用它进行身份验证毫无意义。
到目前为止的想法
gcloud auth login --no-launch-browser
- 需要用户交互,并且每个登录会话提供的密钥似乎是唯一的- 由于 Firebase CLI 使用用户凭据进行身份验证,也许有一种方法可以使用它来验证 gcloud SDK?
- 是否可以让服务帐户继承用户的所有权限?我见过几个这样的例子,但它们只适用于每个项目级别。我意识到这个解决方案是多么的不合时宜。
- gcloud SDK 似乎将用户凭据保存在 /root/.config/gcloud 文件夹中。在设置我的 Docker 容器时,我违背了所有合理的逻辑并复制了这个文件夹。这实际上有效,当我在本地 Docker 容器上运行它时,但当我在 Cloud Run 上运行它时,默认服务帐户似乎会覆盖所有其他凭据。本地 Docker 容器可以访问复制的配置,但即使文件复制成功,gcloud SDK 似乎也无法识别它们。
编辑: 我的意图是让不太懂技术的大学通过单击按钮创建一个具有大量预定义设置的新 Firebase 项目。这包括以下步骤:
- 设置一个新的 Firebase 项目(它会自动设置一个新的 Google Cloud 项目)
- 启用计费
- 设置用户 IAM 角色和升级/下载服务帐户
- 添加谷歌分析
- 添加云存储
- 创建新的云存储桶
- 添加 Firestore 原生模式
- 复制预定义的云功能和安全角色并将其部署到云端
创建的 Google Cloud 项目必须是我们 Google Cloud 组织的一部分。项目的所有者并不重要,因为我在创建后手动设置了 IAM 角色。
以上所有步骤都适用于我的本地系统,当我使用想法 #4 时,它们也适用于 Cloud Run 之外的通用 docker 容器。我正在处理的问题是验证对step #2和step #3的请求。由于这两个请求都处理新创建的项目,因此 Cloud Run 的默认服务身份目前无法拥有对这些请求进行身份验证所需的角色。这就是为什么我正在寻找一种方法来通过 Firebase CLI 在步骤 #1 中使用的相同用户凭据进行身份验证,因为这些凭据默认具有所有者权限。
解决方案
我不确定您想要实现的目标是否可行。而且即使有可能被破解,你也不知道有一天它是否会因为版本更新或 API 更改而被破坏。
此外,在虚拟机上运行的应用程序中使用个人帐户也不是一个好主意。该日志将跟踪您作为用户而不是应用程序身份(服务帐户)。您的个人操作(在您的计算机上以及您对云的访问)和应用程序操作(代表您执行的操作)是什么?
如果您关心的是部署,您可以查看 terraform,甚至可以编写自己的部署脚本。
我不确定是否已经抓住了你所有的障碍和问题,告诉我们更多,也许有很好的解决方法!
推荐阅读
- javascript - 如何在一个文本字段中显示开始日期和结束日期以及月份和年份应该像下拉菜单
- ios - IOS 13 获取 Wifi 和蜂窝网络信号强度
- javascript - 如何转义动态文本
tag inside header using Nuxt JS?</h1> <div id="body"><p>I have integrated WordPress API with a Nuxt based website. It is using below code to show blog Post title fetched from wordpress.</p> <pre><code>h - ios - 基于IOS swift中的复选框状态禁用/启用返回键
- java - java中的"Paths.get("").toAbsolutePath().toString()"和"System.getProperty("user.dir")"有什么区别?
- android-studio - 浏览时未显示 Android Studio Marketplace 中的插件
- c# - 如何再次从 Bot Framework v4 获取自适应卡片列表?
- c# - 只有assignment、call、increment、decrement、await和new对象表达式可以作为语句错误C#
- python - 字节格式的时间数据不匹配
- node.js - 由于 MongoNetworkError 和内存泄漏问题,Node.js 服务器无响应且不稳定