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

如何在Google Cloud Run的Python脚本中建立SSH隧道连接PostgreSQL服务器?

问题解答

核心确认:Cloud Run Python脚本无法原生建立SSH隧道

是的,Google Cloud Run的Python脚本无法原生建立SSH隧道,原因有三点:

  • Cloud Run的容器默认未预装OpenSSH客户端环境;
  • Serverless容器的网络模型限制了本地端口绑定权限,无法稳定维持SSH隧道的端口转发;
  • Cloud Run的无状态特性会导致容器随时被重启,隧道连接无法持久化。

官方指南的核心思路:静态出口IP+数据库白名单

你提到的新官方指南确实是通过配置静态出口IP来替代SSH隧道:

  1. 给Cloud Run服务配置VPC连接器,让流量通过VPC网络出站;
  2. 搭配云NAT服务分配静态公网IP;
  3. 将这个静态IP添加到PostgreSQL服务器的白名单中;
  4. 直接用Python的PostgreSQL客户端(如psycopg2)建立原生TCP连接,无需SSH隧道。
    这种方案是官方推荐的,比SSH隧道更稳定、易维护,也符合Serverless架构的设计逻辑。

可行替代方案

1. Cloud SQL Auth Proxy(仅适用于GCP Cloud SQL数据库)

如果你的PostgreSQL是GCP Cloud SQL实例,直接使用Cloud SQL Auth Proxy:

  • 无需配置IP白名单,通过IAM权限控制访问;
  • Python中可直接通过Unix Socket连接,示例代码:
import psycopg2

conn = psycopg2.connect(
    dbname="your-db-name",
    user="your-db-user",
    password="your-db-password",
    host="/cloudsql/your-project-id:your-region:your-instance-id"
)

2. 自定义容器内置SSH客户端(不推荐)

如果必须使用SSH隧道,可以自定义包含OpenSSH客户端的Cloud Run镜像:

  • 在Dockerfile中安装openssh-client;
  • 将SSH密钥存储在Secret Manager,运行时挂载到容器;
  • 在Python脚本中用subprocess启动SSH隧道进程,再连接数据库,示例片段:
import subprocess
import psycopg2

# 启动SSH隧道
ssh_process = subprocess.Popen([
    "ssh",
    "-i", "/secrets/ssh-key",
    "-L", "5432:db-host:5432",
    "ssh-user@ssh-server",
    "-N"
])

# 连接数据库
conn = psycopg2.connect(
    dbname="your-db-name",
    user="your-db-user",
    password="your-db-password",
    host="localhost",
    port=5432
)

注意:这种方式稳定性差,容器重启会导致隧道中断,仅作为临时应急方案。

3. VPC内部署SSH代理实例

在GCP VPC中部署一个小型Compute Engine实例作为SSH代理:

  • Cloud Run通过VPC连接器访问该代理实例;
  • 代理实例建立到PostgreSQL服务器的SSH隧道;
  • Cloud Run直接连接代理实例的转发端口访问数据库;
  • 仅需将代理实例的IP添加到数据库白名单,Cloud Run无需暴露公网IP。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:30:16