无负载均衡下Cloud Run前后端服务请求路由及访问限制问询
Cloud Run无负载均衡下的前后端请求路由与访问控制
一、用户请求的路由路径
在无负载均衡的默认部署状态下,Cloud Run的每个服务都会分配独立的公网HTTPS URL。用户的请求路径完全取决于你的前端配置:
- 如果你的React前端将API请求直接指向后端服务的公网URL,用户浏览器会直接发起请求到后端服务(绕过前端服务)。
- 如果前端配置了代理(比如React的
setupProxy.js,或构建时配置环境变量指向后端内部地址),用户的请求会先发送到前端服务,再由前端服务转发对应的API请求到后端服务。
简言之:Cloud Run本身不会强制固定路由走向,完全由你前端的请求逻辑决定。
二、限制后端服务仅与前端通信
可以实现,核心是通过Cloud Run的访问控制和服务账号认证来隔离后端:
禁用后端的公网访问
部署后端服务时添加参数:gcloud run deploy backend-service --image=your-java-image --no-allow-unauthenticated配置后,后端服务会拒绝所有未认证的公网请求,仅接受持有有效身份凭证的访问。
给前端服务分配调用后端的权限
- 找到前端服务使用的默认服务账号,给该账号授予
roles/run.invoker角色(允许调用Cloud Run服务):gcloud projects add-iam-policy-binding your-project-id \ --member=serviceAccount:frontend-service-sa@your-project-id.iam.gserviceaccount.com \ --role=roles/run.invoker - 前端服务运行时,可通过GCP元数据服务器获取ID Token,用于后端请求的认证。比如在Node.js环境(React构建后的前端通常部署在Node服务中)可这样实现:
const fetch = require('node-fetch'); async function getAuthToken() { const response = await fetch('http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://backend-service-xxxx.run.app', { headers: { 'Metadata-Flavor': 'Google' } }); return response.text(); } // 发起后端请求时携带Token const token = await getAuthToken(); const backendResponse = await fetch('https://backend-service-xxxx.run.app/api/xxx', { headers: { 'Authorization': `Bearer ${token}` } });
- 找到前端服务使用的默认服务账号,给该账号授予
通过以上配置,后端服务就只能被前端服务(通过认证的服务账号)访问,完全拒绝公网直接请求。
内容的提问来源于stack exchange,提问作者Praveen K M
相关产品推荐
相关产品推荐

