如何通过Java驱动连接私有AWS RDS Postgres实例?
私有AWS RDS Postgres连接方案
一、同VPC内EC2实例直接连接
因为EC2和RDS同属一个VPC且安全组互通,直接使用RDS的内网端点即可连接,无需额外隧道:
- 连接字符串示例(JDBC):
jdbc:postgresql://<RDS内网端点>:5432/<数据库名> - 配置对应RDS的用户名、密码即可建立连接,这是最高效的连接方式。
二、pgAdmin通过SSH隧道连接
私有RDS无公网访问入口,必须通过跳板机(Bastion Host)建立SSH隧道访问:
- 准备一台同VPC的EC2作为跳板机,其安全组需允许你的本地IP访问22端口(SSH);
- 在pgAdmin中新建服务器:
- 切换到「SSH隧道」选项卡,勾选「使用SSH隧道」;
- 填写跳板机的公网IP、SSH端口(默认22)、SSH用户名(如
ec2-user),并选择本地的私钥文件(连接跳板机的密钥); - 切换到「连接」选项卡,主机名/地址填RDS的内网端点,端口填5432,再输入数据库名、RDS用户名和密码;
- 保存后即可通过SSH隧道连接私有RDS。
三、本地非Spring Java应用配置SSH隧道
Java原生不支持SSH隧道,需借助JSch库实现端口转发,步骤如下:
1. 引入JSch依赖
如果用Maven,在pom.xml中添加:
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency>
2. 实现SSH隧道管理类
import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import java.util.Properties; public class SshTunnelManager { private Session sshSession; /** * 建立SSH本地端口转发隧道 * @param bastionHost 跳板机公网IP * @param bastionUser 跳板机登录用户名 * @param privateKeyPath 本地私钥文件路径(如~/.ssh/id_rsa或.pem文件) * @param localPort 本地映射端口(选未被占用的端口,如54320) * @param rdsHost RDS内网端点 * @param rdsPort RDS端口(默认5432) */ public void openTunnel(String bastionHost, String bastionUser, String privateKeyPath, int localPort, String rdsHost, int rdsPort) throws Exception { JSch jsch = new JSch(); jsch.addIdentity(privateKeyPath); // 加载私钥 sshSession = jsch.getSession(bastionUser, bastionHost, 22); Properties config = new Properties(); // 生产环境建议改为"yes",提前将跳板机公钥加入本地known_hosts config.put("StrictHostKeyChecking", "no"); sshSession.setConfig(config); sshSession.connect(); // 将本地localPort转发到RDS的rdsHost:rdsPort sshSession.setPortForwardingL(localPort, rdsHost, rdsPort); } /** * 关闭SSH隧道 */ public void closeTunnel() { if (sshSession != null && sshSession.isConnected()) { sshSession.disconnect(); } } }
3. 在JDBC连接中使用隧道
import java.sql.Connection; import java.sql.DriverManager; public class DbConnector { public static void main(String[] args) { SshTunnelManager tunnelManager = new SshTunnelManager(); Connection dbConn = null; try { // 初始化SSH隧道 tunnelManager.openTunnel( "跳板机公网IP", "ec2-user", "/Users/xxx/.ssh/my-bastion-key.pem", 54320, "my-rds-instance.xxxxxx.us-east-1.rds.amazonaws.com", 5432 ); // JDBC连接使用localhost+本地映射端口 String jdbcUrl = "jdbc:postgresql://localhost:54320/my-db-name"; String dbUser = "rds-admin"; String dbPassword = "rds-password"; dbConn = DriverManager.getConnection(jdbcUrl, dbUser, dbPassword); System.out.println("数据库连接成功!"); // 执行数据库操作... } catch (Exception e) { e.printStackTrace(); } finally { // 关闭资源 try { if (dbConn != null) dbConn.close(); } catch (Exception e) {} tunnelManager.closeTunnel(); } } }
四、最优方案推荐(安全+易用)
如果长期使用,推荐用AWS Systems Manager Session Manager替代传统SSH跳板机:
- 无需开放EC2的22端口,通过AWS SSM权限控制访问,安全性更高;
- 用AWS CLI建立端口转发:
aws ssm start-session --target <EC2实例ID> \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ --parameters '{"host":["<RDS内网端点>"], "portNumber":["5432"], "localPortNumber":["54320"]}' - 执行命令后,本地pgAdmin和Java应用都可以通过
localhost:54320连接RDS,无需管理SSH密钥。
内容的提问来源于stack exchange,提问作者Age of Empires
相关产品推荐
相关产品推荐

