GCP技术咨询:Cloud Scheduler能否调用内部Cloud Run服务端点?
解决方案
方案一:通过VPC访问连接器实现无代码修改的内部服务访问
这个方案能同时解决SC无法访问内部CR1,以及CR2无需修改代码即可访问CR1的问题:
- 创建VPC访问连接器,关联到CR1所在的VPC网络,确保连接器的IP范围和VPC内其他资源不冲突
- 将CR1配置为内部服务,并设置允许来自该VPC网络的流量
- 配置Cloud Scheduler作业:
- 选择HTTP目标类型,填写CR1的内部域名(格式为
[服务名].[区域].internal.run.app) - 在"VPC连接"选项中选择刚创建的VPC连接器
- 确保SC使用的服务账号拥有访问VPC连接器的权限(默认服务账号通常已有权限,若没有则添加
roles/vpcaccess.user)
- 选择HTTP目标类型,填写CR1的内部域名(格式为
- 部署CR2时,关联同一个VPC访问连接器,或者确保CR2和CR1处于同一个VPC网络中:
- CR2可以直接通过内部域名调用CR1,无需添加身份验证逻辑,因为内部服务仅允许VPC内流量访问,天然受保护
方案二:基于身份验证的无代码适配(适用于使用Google客户端库的场景)
如果不想用VPC连接器,可通过服务账号授权实现,且若CR2使用Google官方客户端库发送请求,无需修改代码:
- 将CR1配置为需要身份验证的服务
- 给Cloud Scheduler的服务账号授予
roles/run.invoker权限,允许其调用CR1 - 配置SC作业时,选择"添加OIDC令牌",指定CR1的受众(audience)为CR1的服务URL
- 给CR2的运行服务账号也授予
roles/run.invoker权限:- 若CR2使用Google客户端库(如Go的
google.golang.org/api/transport、Python的google-auth等)发送HTTP请求,客户端会自动从元数据服务器获取身份令牌并添加到请求头,无需修改业务代码 - 若CR2使用自定义HTTP请求,此方案不适用,需优先选择方案一
- 若CR2使用Google客户端库(如Go的
内容的提问来源于stack exchange,提问作者Undoht
相关产品推荐
相关产品推荐

