GCP Cloud Run容器因权限问题无法被Cloud Function调用修复咨询
问题根因
本次直接返回授权报错的核心原因是Cloud Function使用的服务账号没有目标Cloud Run服务的调用权限,与你此前遇到的运行一段时间后报错的令牌过期问题无关,按照以下步骤操作即可修复:
步骤1:获取Cloud Function的运行服务账号
- 进入GCP控制台Cloud Function页面,打开负责调用Cloud Run的函数详情页
- 切换到「详情」标签,找到运行时服务账号字段,记录该邮箱格式的账号,默认格式为
[项目ID]@appspot.gserviceaccount.com,也可能为你自定义的服务账号
步骤2:授予服务账号Cloud Run调用权限
- 进入Cloud Run页面,打开目标容器服务的详情页
- 点击顶部「权限」标签,选择「授予访问权限」
- 在「添加主体」输入框粘贴上一步记录的服务账号邮箱
- 在「分配角色」下拉框搜索并选择
Cloud Run 调用者角色 - 点击保存,权限一般1-2分钟即可生效
步骤3:校验Cloud Function调用逻辑
如果权限配置完成后仍报错,检查Cloud Function的调用代码:
- 确认请求头中携带的身份令牌是针对目标Cloud Run服务的URL生成的
- 参考代码示例(Python):
import requests import google.auth.transport.requests from google.oauth2 import id_token def call_cloud_run(request): # 此处填Cloud Run服务的完整根URL,不要带额外路径 target_audience = "https://你的Cloud Run服务域名.a.run.app" # 生成调用用ID令牌 req = google.auth.transport.requests.Request() id_token_val = id_token.fetch_id_token(req, target_audience) # 发起请求 headers = {"Authorization": f"Bearer {id_token_val}"} resp = requests.get(target_audience, headers=headers) return resp.text
注意:生成令牌的
target_audience必须与Cloud Run服务的根URL完全一致,不能携带路径、多写斜杠,否则也会触发授权错误。
步骤4:验证修复效果
手动触发一次Cloud Function执行,查看Cloud Run日志是否还返回授权报错即可。
内容的提问来源于stack exchange,提问作者p_mo
相关产品推荐
相关产品推荐

