设置Ingress Control后Cloud Run客户端服务无法连接后端服务排查
排查Cloud Run VPC-only Ingress导致的前后端连接问题
核心问题先搞清楚
你把后端Cloud Run设成仅允许VPC流量后,它就彻底拒绝公网请求了。但你的静态页Cloud Run是公网可访问的,它发的请求属于公网来源,直接被后端的Ingress规则挡了,返回403。这也是为啥之前没开Ingress时CORS正常——那时请求能到FastAPI,CORS配置能生效,现在请求连后端服务的门都没进,浏览器自然报CORS错误。
一步步排查解决
1. 给前端Cloud Run接入VPC
静态页Cloud Run默认不在VPC里,要让它能访问VPC-only的后端,必须配置Serverless VPC Access Connector,把它拽进和后端同一个VPC网络:
- 进前端Cloud Run服务的设置页,找到“VPC连接”,添加已有的VPC连接器(如果没有就新建一个,选和后端一致的VPC及子网)。
- 配置完后,前端的请求会走VPC连接器发往后端,符合后端的Ingress规则。
2. 给前端服务账号加权限
就算在同一个VPC,前端Cloud Run的服务账号也得有调用后端的权限:
- 找到前端Cloud Run的默认服务账号(格式是
[你的项目编号]-compute@developer.gserviceaccount.com)。 - 在IAM里给这个账号添上Cloud Run Invoker角色,作用对象选你的后端Cloud Run服务。
3. 搞定AlloyDB的SSL错误(operationalError: SSL SysCall error: eof detected)
这个错误和VPC连接、数据库SSL配置或权限有关:
- 确认后端Cloud Run的VPC连接器开了私有访问,能通AlloyDB的私有IP(AlloyDB只有私有IP)。
- 检查数据库连接代码:AlloyDB强制要求SSL,确保你用了正确的根证书(Google提供的
server-ca.pem),或者驱动里设置了sslmode=require(比如psycopg2)。 - 给后端Cloud Run的服务账号添
roles/alloydb.client角色,不然连不上AlloyDB。
4. 回头验证CORS配置
等前面的网络问题解决后,再确认FastAPI的CORS:
- 确保允许的origin里包含前端Cloud Run的域名(比如
https://[前端服务名]-[哈希].a.run.app),调试阶段可以暂时设allow_origins=["*"]测一下。 - 如果前端用后端的内部域名访问(比如
http://[后端服务名].[区域].run.app),别忘了把这个内部域名也加进允许列表。
快速验证方法
- 给前端加上VPC连接器后,进前端Cloud Run的shell,执行
curl https://[后端服务URL],看能不能拿到正常响应。 - 看后端Cloud Run的日志,确认请求是不是真的到了服务里(而不是被Ingress拦了)。
内容的提问来源于stack exchange,提问作者funtkungus
相关产品推荐
相关产品推荐

