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

跨项目服务账号连接Cloud SQL遇403权限问题求助

跨项目服务账号连接Cloud SQL触发403权限错误的排查与解决

环境背景

  • 资源分布:
    • project_a:服务账号 sa_project_a
    • project_b:Cloud SQL MySQL实例、服务账号 sa_project_b
    • project_c:K8s上的Airflow集群(默认使用 sa_project_a 做身份验证)
  • 权限配置:sa_project_a 和 sa_project_b 在project_b上均配置了 BigQuery Data Viewer、BigQuery Job User、Cloud SQL Client、Secret Manager Secret Accessor 角色
  • 现象:
    • 使用 sa_project_a 通过 cloud-sql-python-connector 连接project_b的Cloud SQL时触发403错误
    • 切换为同项目的 sa_project_b 后连接正常
    • 已在三个项目中启用 Cloud SQL Admin API

错误详情

aiohttp.client_exceptions.ClientResponseError: 403, message="Forbidden: Authenticated IAM principal does not seem authorized to make API request. Verify 'Cloud SQL Admin API' is enabled within your GCP project and 'Cloud SQL Client' role has been granted to IAM principal.", url='https://sqladmin.googleapis.com/sql/v1beta4/projects/{project_id}/instances/{instance_id}/connectSettings'

原因分析

  1. 跨项目API调用权限缺失:
    跨项目服务账号(sa_project_a)调用Cloud SQL Admin API时,除了目标项目(project_b)的Cloud SQL Client权限,还需要在**自身所属项目(project_a)**拥有调用该API的权限。同项目服务账号(sa_project_b)默认拥有本项目API的调用权限,因此无需额外配置。
  2. 凭据传递问题:
    Airflow集群默认使用的sa_project_a凭据可能未正确传递API调用权限,或者工作负载身份绑定(若使用)存在范围限制,导致无法跨项目调用Cloud SQL Admin API。

解决办法

办法1:补充sa_project_a的跨项目API调用权限

  • 在project_a中,为sa_project_a授予 Service Usage Consumer 角色,允许其调用已启用的GCP API
  • 确认project_a中的Cloud SQL Admin API保持启用状态
  • 若使用工作负载身份绑定,检查绑定规则未限制API调用的项目范围

办法2:显式指定sa_project_a的凭据初始化Connector

将sa_project_a的JSON凭据存储到project_b的Secret Manager中,在连接时显式加载并传入Connector:

import json
import os
from google.cloud import secretmanager
from google.oauth2 import service_account
from cloud_sql_proxy.connector import Connector, IPTypes

ip_type = IPTypes.PRIVATE if os.environ.get("PRIVATE_IP") else IPTypes.PUBLIC

# 从Secret Manager获取sa_project_a的凭据
client = secretmanager.SecretManagerServiceClient()
name = f"projects/project_b/secrets/sa_project_a_credentials/versions/latest"
request = client.access_secret_version(request={"name": name})
sa_creds = json.loads(request.payload.data.decode("UTF-8"))
credentials = service_account.Credentials.from_service_account_info(sa_creds)

# 用指定凭据初始化Connector
connector = Connector(ip_type=ip_type, credentials=credentials)

办法3:验证工作负载身份绑定配置(若Airflow使用此方式)

如果Airflow集群通过工作负载身份绑定到sa_project_a,需确认:

  • 绑定的IAM角色包含project_b的Cloud SQL Client和project_a的Service Usage Consumer
  • 绑定条件未限制对project_b Cloud SQL实例的访问

内容的提问来源于stack exchange,提问作者Chutdanai Thongsom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:33:26