GCP中Cloud Run服务B调用服务A出现Forbidden错误的解决方法
解决Cloud Run服务B调用服务A的403 Forbidden问题
核心问题分析
当前403错误主要源于两个关键缺失:防火墙规则未覆盖Serverless VPC连接器的IP段,以及Cloud Run服务A未授权服务B的调用权限。
具体解决步骤
1. 更新VPC入站防火墙规则
现有入站规则仅允许10.0.0.0/24网段的流量,但服务B通过Serverless VPC连接器发起的请求源IP属于10.8.0.0/28,不在规则覆盖范围内,导致流量被拦截:
- 编辑全局入站防火墙规则,将源IPv4范围修改为
10.0.0.0/24,10.8.0.0/28 - 确认规则动作为"允许",优先级设置为低于默认拒绝规则(比如保持65534即可,确保不会被更高优先级的拒绝规则覆盖)
2. 为服务B授予服务A的调用权限
Cloud Run服务默认启用身份认证,即使在VPC内,未授权请求也会被拒绝:
- 进入Cloud Run控制台的服务A页面,切换到「权限」标签
- 点击「添加主账号」,输入服务B的服务账号(可在服务B详情页获取,格式为
service-<项目编号>@gcp-sa-cloudrun.iam.gserviceaccount.com) - 为该账号分配
Cloud Run Invoker角色,保存配置
3. 规范服务B的调用方式
- 确保服务B调用服务A时使用内部服务URL(可在服务A详情页获取,格式为
https://<服务A名称>-<哈希值>-<区域>.run.app),而非外部公开URL - 服务B的代码中需正确获取并携带身份令牌,示例Python代码:
import google.auth import google.auth.transport.requests credentials, _ = google.auth.default() auth_req = google.auth.transport.requests.Request() credentials.refresh(auth_req) token = credentials.token # 调用服务A时添加认证头 headers = {"Authorization": f"Bearer {token}"}
4. 验证连接器与服务配置
- 确认Serverless VPC连接器状态为"就绪",且关联到服务A所在的VPC
- 检查服务B的出站流量配置,确认已正确选择该连接器,确保VPC内部流量全部通过连接器转发
内容的提问来源于stack exchange,提问作者sidharth sunilkumar
相关产品推荐
相关产品推荐

