如何用Python连接私有子网中的PostgreSQL RDS并实现端口转发?
用Python查询私有子网中的PostgreSQL RDS及SSM端口转发实现
完全可行。你的PostgreSQL RDS部署在私有子网中无法直接从公网访问,但借助已配置SSM的堡垒机,可通过端口转发打通本地Python程序与RDS的网络连接,进而执行查询操作。
实现步骤及示例代码
以下是通过Python调用AWS CLI实现SSM端口转发,并连接RDS查询的方案:
环境准备
先安装必要依赖:pip install boto3 awscli psycopg2-binary确保本地AWS凭证(通过配置文件、环境变量或IAM角色)拥有
ssm:StartSession权限,且堡垒机实例的安全组允许访问RDS的5432端口。Python代码实现
import subprocess import time import psycopg2 # 替换为你的实际参数 SSM_INSTANCE_ID = "堡垒机EC2实例ID" RDS_ENDPOINT = "你的RDS数据库端点" RDS_PORT = 5432 LOCAL_FORWARD_PORT = 54320 # 本地映射端口,可自定义 DB_NAME = "目标数据库名" DB_USER = "数据库用户名" DB_PASSWORD = "数据库密码" # 启动SSM端口转发会话 ssm_cmd = [ "aws", "ssm", "start-session", "--target", SSM_INSTANCE_ID, "--document-name", "AWS-StartPortForwardingSessionToRemoteHost", "--parameters", f"host={RDS_ENDPOINT},portNumber={str(RDS_PORT)},localPortNumber={str(LOCAL_FORWARD_PORT)}" ] # 启动端口转发子进程 tunnel_process = subprocess.Popen(ssm_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 等待端口转发通道建立 time.sleep(5) try: # 通过本地转发端口连接RDS conn = psycopg2.connect( dbname=DB_NAME, user=DB_USER, password=DB_PASSWORD, host="localhost", port=LOCAL_FORWARD_PORT ) # 执行查询示例 with conn.cursor() as cur: cur.execute("SELECT current_date;") query_result = cur.fetchone() print(f"查询结果: {query_result[0]}") conn.close() finally: # 关闭端口转发进程 tunnel_process.terminate() tunnel_process.wait()
关键说明
- 堡垒机需部署在能访问私有子网RDS的VPC中,且安全组规则允许堡垒机向RDS的5432端口发起连接。
- 若不想依赖AWS CLI,也可使用
boto3直接调用SSM API启动会话,再手动处理Socket端口转发,但实现复杂度更高。 - 确保SSM Agent在堡垒机上正常运行,这是SSM会话建立的前提。
内容的提问来源于stack exchange,提问作者Judi
相关产品推荐
相关产品推荐

