如何通过SSH跳板机将Django应用连接到AWS私有RDS实例
如何通过SSH跳板机让本地Django连接AWS私有子网的RDS?
你遇到的报错本质是两个核心问题:
- 私有子网的RDS的Endpoint域名只有AWS VPC内部的DNS才能解析,你本地环境直接访问无法完成域名解析
- DBeaver连接成功是因为你在DBeaver中配置了SSH隧道代理,所有流量走跳板机转发,而你直接启动Django时没有配置对应的隧道,流量直接访问公网自然找不到私有RDS地址
方案1:手动建立SSH端口转发(适合临时调试)
在本地终端执行以下命令建立本地端口到RDS的SSH转发,流量会自动通过跳板机中转:
ssh -N -L 5433:xxx.zzz.us-east-z.rds.amazonaws.com:5432 ec2-user@<跳板机公网IP> -i <你的跳板机私钥文件路径>
参数说明:
-N:不执行远程命令,仅做端口转发-L:本地端口转发规则,格式为本地端口:RDS域名:RDS端口
命令执行后保持终端窗口不关闭,修改Django的数据库配置即可:
DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql_psycopg2", "NAME": "aaaa", "USER": "bbbb", "PASSWORD": "cccc", "HOST": "127.0.0.1", # 改为本地地址 "PORT": 5433, # 改为转发的本地端口 } }
方案2:代码中自动维护SSH隧道(适合本地开发场景)
如果不想一直保持终端窗口开启,可以用sshtunnel库在Django启动时自动建立隧道:
- 先安装依赖
pip install sshtunnel
- 修改
settings.py配置
from sshtunnel import SSHTunnelForwarder # 启动SSH隧道 tunnel = SSHTunnelForwarder( ('<跳板机公网IP>', 22), ssh_username='ec2-user', ssh_pkey='<你的跳板机私钥文件路径>', remote_bind_address=('xxx.zzz.us-east-z.rds.amazonaws.com', 5432) ) tunnel.start() DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql_psycopg2", "NAME": "aaaa", "USER": "bbbb", "PASSWORD": "cccc", "HOST": "127.0.0.1", "PORT": tunnel.local_bind_port, # 自动获取隧道绑定的本地端口 } }
注意事项
- 以上两个方案仅适用于本地开发调试场景,生产环境的Django服务请部署在与RDS同VPC的子网内,无需通过跳板机访问RDS
- 请确认跳板机安全组已放行本地IP的22端口访问,RDS安全组已放行跳板机私有IP的5432端口访问
- 若本地端口5432被占用,可更换为其他未被占用的端口(如5433等)
内容的提问来源于stack exchange,提问作者feldo badix
相关产品推荐
相关产品推荐

