我必须在Google run上运行docker镜像A和B。 A需要较小的内存占用空间和较慢的扩展速度(这是前端),而B需要较高的内存占用空间并在负载下需要较大的扩展性(这是后端)。
我将A设为公开(allUser可以触摸:80),将B设为私有(我没有选中此复选框)。 由于Google云端实例没有静态IP,而是动态URL,如何使A(通过http)对B“说话”,同时又使B无法从野外访问?
现在,我发现的唯一解决方法是为allUser打开HTTP端口,并为B使用子域名(例如b.my.app),然后从A调用“ http://b.my.app”。 / p>
这是一个非常糟糕的解决方案,因为B可以从Google网络的外部进行触摸。
答案 0 :(得分:1)
由于服务B是私有的(需要身份验证),因此服务A将需要在对服务B的请求中包括HTTP授权标头。
标题看起来像这样:
Authorization: Bearer <replace_with_token
令牌是OAuth 2.0身份令牌(不是访问令牌)。用户凭据或服务帐户的IAM成员电子邮件地址将以角色roles/run.invoker
添加到服务B。
您仍然需要调用服务B的终结点URL(xxx.y.run.app)。除非您也实现自定义域,否则这不会改变。
Cloud Run的一个不错的功能是,当需要身份验证时,Cloud Run Proxy会为您处理。代理位于Cloud Run的前面,并阻止所有未授权的请求。您的实例永远不会启动,因此在黑客试图穿越时没有计费时间。
在我网站上的一篇文章中,我演示了如何在Go(link)中生成身份令牌。在本文中,使用CURL(link),这是一个由三部分组成的系列。互联网上有许多文章对此进行了解释。在另一篇文章中,我解释了云运行身份如何工作(link)和基于云运行身份的访问控制如何工作(link)。
查看--service-account选项,该选项可让您设置用于身份验证的服务帐户(link)。
Cloud Run Authentication文档(link)。