You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:55:54