为何无法将Google Cloud Functions连接至Cloud SQL MySQL?
排查Cloud Functions(第一代)连接Cloud SQL MySQL失败的步骤
一、基础配置校验
- 确认环境变量已正确配置:
instance_connection_name格式必须是项目ID:区域:实例名,且已在Cloud Functions的环境变量中正确设置db_user、db_pass、db_name需与Cloud SQL实例中创建的账号、密码、数据库名完全匹配
- 检查网络配置:
- 公网IP连接:确认Cloud SQL实例的公网IP已将Cloud Functions的出口IP添加到授权列表(可临时授权
0.0.0.0/0测试,排查是否为IP授权问题) - 内网IP连接:确认Cloud Functions与Cloud SQL实例处于同一VPC,且已配置Serverless VPC Access连接器
- 公网IP连接:确认Cloud SQL实例的公网IP已将Cloud Functions的出口IP添加到授权列表(可临时授权
二、代码优化与调试
当前代码仅创建连接池但未触发实际数据库连接,无法生成有效排查日志。建议修改入口函数,添加测试查询并捕获异常:
import os import logging from google.cloud.sql.connector import Connector, IPTypes import pymysql import sqlalchemy # 配置日志输出 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def connect_with_connector(): """初始化连接池并测试数据库连接""" try: # 读取环境变量(需提前在Cloud Functions控制台配置) instance_connection_name = os.environ["INSTANCE_CONNECTION_NAME"] db_user = os.environ["DB_USER"] db_pass = os.environ["DB_PASS"] db_name = os.environ["DB_NAME"] ip_type = IPTypes.PRIVATE if os.environ.get("PRIVATE_IP") else IPTypes.PUBLIC connector = Connector(ip_type) def getconn(): conn = connector.connect( instance_connection_name, "pymysql", user=db_user, password=db_pass, db=db_name, ) return conn # 创建带参数的连接池,提升稳定性 pool = sqlalchemy.create_engine( "mysql+pymysql://", creator=getconn, pool_size=5, max_overflow=2, pool_recycle=300, pool_pre_ping=True, ) # 执行测试查询,触发实际连接 with pool.connect() as conn: result = conn.execute(sqlalchemy.text("SELECT 1")) logger.info(f"连接成功,测试查询结果: {result.fetchone()}") return "数据库连接成功" except Exception as e: # 打印详细异常栈,便于排查 logger.error(f"连接失败: {str(e)}", exc_info=True) return f"连接失败: {str(e)}"
三、依赖与权限检查
- 优化
requirements.txt,指定兼容版本避免依赖冲突:google-cloud-sql-connector>=1.14.0 pymysql>=1.1.0 sqlalchemy>=2.0.0 - 确认Cloud Functions服务账号权限:
- 必须拥有
Cloud SQL Client角色(roles/cloudsql.client) - 使用内网IP时,需额外添加
Serverless VPC Access User角色
- 必须拥有
四、日志排查技巧
- 在Cloud Functions控制台的日志页面,切换到高级日志过滤器,用以下规则捕获详细错误:
resource.type="cloud_function" resource.labels.function_name="你的函数名" severity>=ERROR - 开启Cloud SQL的审计日志,查看是否有来自Cloud Functions的连接请求被拒绝的记录
内容的提问来源于stack exchange,提问作者Josue
相关产品推荐
相关产品推荐

