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

Cloud Run Job连接Cloud SQL时出现pg8000 InterfaceError问题求助

Cloud Run Job 连接Cloud SQL 报错 InterfaceError

InterfaceError - (pg8000.exceptions.InterfaceError) Can't create a connection to host 127.0.0.1 and port 5432 (timeout is None and source_address is None).

基础环境

  • Cloud SQL实例为公开访问,与Cloud Run Job属于同一账号及同一区域
  • 已通过GCP控制台为Cloud Run Job配置Cloud SQL连接
  • 用Python代码执行简单的select *数据库查询

本地Docker复现错误

  • 搭配Cloud SQL Proxy,执行命令docker run --rm --network=host job1可成功连接数据库
  • 移除--network=host参数后,执行docker run --rm job1会复现与Cloud Run上完全一致的错误

主机地址尝试情况

  • 本地按GCP官方示例将主机地址设为127.0.0.1可正常连接
  • 在Cloud Run上先后尝试将主机地址设为127.0.0.1和/cloudsql/project:region:instance,均无法解决问题

运行在Cloud Run上的Python代码

import os

import pandas
import sqlalchemy


def execute_sql(query, engine):
    with engine.connect() as connection:
        df = pandas.read_sql(
            con=connection,
            sql=query
        )
    return df


def connect_tcp_socket() -> sqlalchemy.engine.base.Engine:
    db_user = 'postgres'  # e.g. 'my-database-user'
    db_pass = 'abcxyz123'  # e.g. 'my-database-password'
    db_name = 'development'  # e.g. 'my-database'
    db_host = os.getenv('host', '127.0.0.1')
    db_port = os.getenv('port', 5432)
    connect_args = {}
    pool = sqlalchemy.create_engine(
        sqlalchemy.engine.url.URL.create(
            drivername="postgresql+pg8000",
            username=db_user,
            password=db_pass,
            host=db_host,
            port=db_port,
            database=db_name,
        ),
        connect_args=connect_args,
        pool_size=5,
        max_overflow=2,
        pool_timeout=30,  # 30 seconds
        pool_recycle=1800,  # 30 minutes
    )
    return pool


def func1():
    engine = connect_tcp_socket()
    query = 'select * from public.administrator;'
    df = execute_sql(query, engine)
    print(f'df={df}')


if __name__ == '__main__':
    func1()

问题分析与解决方法

核心原因

Cloud Run Job中使用pg8000驱动连接Cloud SQL时,若采用Unix套接字方式,不能直接将host参数设为套接字路径。TCP连接的配置逻辑不适用于Unix套接字,这是导致连接超时的根本原因。

解决方案

修改数据库连接逻辑,适配Cloud Run的Unix套接字连接方式:

  1. 在connect_args中指定unix_sock参数,值为Cloud SQL套接字路径加上PostgreSQL默认的套接字文件名.s.PGSQL.5432
  2. 无需设置host和port参数,直接通过套接字建立连接

修改后的连接函数示例:

def connect_cloud_sql() -> sqlalchemy.engine.base.Engine:
    db_user = 'postgres'
    db_pass = 'abcxyz123'
    db_name = 'development'
    # 从环境变量获取Cloud SQL连接名称(推荐),或直接填写完整路径
    cloud_sql_conn_name = os.getenv('CLOUD_SQL_CONNECTION_NAME')
    unix_socket_path = f"/cloudsql/{cloud_sql_conn_name}/.s.PGSQL.5432"

    pool = sqlalchemy.create_engine(
        sqlalchemy.engine.url.URL.create(
            drivername="postgresql+pg8000",
            username=db_user,
            password=db_pass,
            database=db_name,
        ),
        connect_args={"unix_sock": unix_socket_path},
        pool_size=5,
        max_overflow=2,
        pool_timeout=30,
        pool_recycle=1800,
    )
    return pool

额外检查项

  • 确认Cloud Run Job的服务账号已被授予Cloud SQL Client角色权限
  • 控制台配置的Cloud SQL连接名称格式为project-id:region:instance-name,无拼写错误
  • 若选择TCP连接方式,需将Cloud Run的出口IP添加到Cloud SQL实例的白名单,但此方式安全性较低,不推荐使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 02:45:20