同GCP项目调用设仅允许内部流量的Cloud Function报403错误
问题分析与解决方案
这不是预期行为,你遇到的403错误主要源于两个关键配置错误,结合权限和调用格式的细节问题,以下是具体修正点:
1. 请求头名称错误(核心问题)
你的代码里将认证头写成了Authentication,但标准的HTTP Bearer认证头是Authorization——这个错误会导致R函数无法识别令牌,直接返回403。
2. 令牌受众(Audience)配置错误
用服务账号生成令牌时,必须指定受众为R函数的完整调用URL,而非泛用的https://www.googleapis.com/auth/cloud-platform scope。Cloud Function的IAM认证要求令牌的aud字段严格匹配函数的调用地址,否则会被拒绝。
修正后的C代码示例
import requests import functions_framework import google.auth.transport.requests from flask import Request from typing import Tuple from google.oauth2 import service_account import os, json def get_token(function_url: str) -> str: service_account_key = json.loads(os.getenv('SA')) # 指定受众为目标函数的URL,这是IAM认证的必要条件 credentials = service_account.Credentials.from_service_account_info( service_account_key, target_audience=function_url ) auth_req = google.auth.transport.requests.Request() credentials.refresh(auth_req) return credentials.token @functions_framework.http def test(req: Request) -> Tuple[str, int]: function_url = "https://REGION-YOUR_PROJECT_ID.cloudfunctions.net/R" # 替换为R的实际URL headers = { "Authorization": f"Bearer {get_token(function_url)}" # 修正头名称 } response = requests.get(function_url, headers=headers) return response.text, response.status_code
额外验证项
- 权限确认:确保服务账号SA确实被授予了
roles/cloudfunctions.invoker角色,且该角色直接绑定到R函数资源上(项目级绑定也生效,但函数级更精准)。 - VPC连接器配置:确认C函数使用的Serverless VPC Connector与R函数所在的VPC网络一致(R开启仅内部流量后,仅接受来自同一VPC或对等VPC的流量)。
- 函数URL格式:调用R函数时必须使用官方完整格式
https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME,不要使用内部IP或自定义域名(除非配置了对应映射)。
内容的提问来源于stack exchange,提问作者Marco Mantovani
相关产品推荐
相关产品推荐

