1

我必须在 google run 上运行图像 A 和 B。A 需要较小的内存占用和缓慢的扩展(它是前端),而 B 需要高内存占用冲刺和负载下的大量扩展(它是后端)。

我将 A 设为公开(allUser 可以触摸 :80 ),将 B 设为私有(我没有选中复选框)。由于谷歌云实例没有静态 IP 而是动态 URL,我怎样才能让 A 与 B(通过 http)“说话”,同时保持 B 无法从野外访问?


现在,我发现的唯一解决方法是为两者打开所有用户的 HTTP 端口,并为 B 使用子域名(如 b.my.app)并从 A调用“ http://b.my.app ”。

这是一个非常糟糕的解决方案,因为 B 可以从谷歌的网络之外被触及。

4

1 回答 1

2

由于服务 B 是私有的(需要身份验证),因此服务 A 需要在对服务 B 的请求中包含 HTTP 授权标头。

标题如下所示:

Authorization: Bearer <replace_with_token

该令牌是 OAuth 2.0 身份令牌(不是访问令牌)。User Credentials 或 Service Account 的 IAM 成员电子邮件地址将添加到具有角色的服务 roles/run.invokerB。

您仍然需要调用服务 B 的端点 URL (xxx.y.run.app)。除非您还实现了自定义域,否则这不会改变。

Cloud Run 的一个不错的功能是,当需要身份验证时,Cloud Run 代理会为您处理此问题。代理位于 Cloud Run 前面并阻止所有未经授权的请求。您的实例永远不会启动,因此在黑客试图通过时没有计费时间。

在我网站上的一篇文章中,我展示了如何在 Go 中生成身份令牌(链接)。在这篇文章中使用 CURL (链接) 这是一个由三部分组成的系列。Internet 上也有许多文章对此进行了解释。在另一篇文章中,我解释了 Cloud Run Identity 的工作原理(链接)以及 Cloud Run Identity Based Access Control 的工作原理(链接)。

查看 --service-account 选项,该选项允许您设置服务帐户以用于身份(链接)。

Cloud Run 身份验证文档(链接)。

于 2019-06-21T22:55:43.520 回答