google-cloud-run - 在 Google Cloud Run (gRPC/Python) 上连接两个服务
问题描述
我刚刚浪费了今天的大部分时间,尝试使用 gRPC 和 Python 连接部署在 Google Cloud Run 上的两个微服务。事实证明,如果我为我尝试调用的服务打开触发器入口以“允许所有流量”和“需要身份验证”,我可以从其他服务连接到它。
但是,当我将入口设置为“仅允许内部流量”(仍然设置“需要身份验证”)时,我的服务无法再连接到它并在日志中引发 Permissions Denied 错误:
status = StatusCode.PERMISSION_DENIED details = "收到状态为 403 的 http2 标头"
我在被调用的服务上看不到任何日志以表明它正在阻止或接收任何内容,并且由于唯一更改的是入口设置,我假设在服务公开时使用 IAM 用户进行身份验证不是问题。
在入口文档(https://cloud.google.com/run/docs/securing/ingress)中,我看到一条说明它只允许 VPC 流量,所以我开始创建 VPC 网络和无服务器 VPC 连接器并附加它们到这两个服务(并更新 IAM 服务帐户以允许访问连接器) - 仍然遇到同样的问题。
我现在要放弃了。我不喜欢公开我的内部服务的想法,但打开内部入口似乎不起作用。
有没有人设法在 Google Cloud Run 上连接两个服务,只有一个内部流量,如果是这样,我需要做什么才能让它工作?
谢谢!
解决方案
在您的前端 Cloud Run 服务中,您需要放置一个 VPC 连接器并将所有流量路由到它(出口 = 全部)。在后端服务上,您不需要无服务器 VPC 连接器。
更进一步,即使您将入口设置为内部,也始终可以从互联网访问 Cloud Run。事实上,有一个内部规则检查请求元数据(谷歌内部网络内部)以验证流量是否来自您的项目 VPC。而且因为它是可公开访问的,所以您需要将所有出口流量路由到 VPC,否则公共访问不会通过您的 VPC,您会得到 403。
推荐阅读
- javascript - 为什么这些孩子没有在 TS 中呈现为数组?
- python - 为什么范围(开始,停止,步骤)不起作用?
- swift - Swift SpriteKit 游戏给出错误“尝试添加已经有父节点的 SKNode”
- c# - 将二维数组上的两个循环转换为 Linq 语法
- firebase - Firestore - 一个事务中的多个添加和更新操作
- css - z-index 和 translateZ() 的区别
- php - 从 href 链接获取电子邮件地址
- prometheus - Prometheus 批量导入
- python-3.x - Pytest:没有运行测试
- ruby-on-rails - 如何解决 Rails 表单中的多个nested_resources?