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

如何通过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隧道访问:

  1. 准备一台同VPC的EC2作为跳板机,其安全组需允许你的本地IP访问22端口(SSH);
  2. 在pgAdmin中新建服务器:
    • 切换到「SSH隧道」选项卡,勾选「使用SSH隧道」;
    • 填写跳板机的公网IP、SSH端口(默认22)、SSH用户名(如ec2-user),并选择本地的私钥文件(连接跳板机的密钥);
    • 切换到「连接」选项卡,主机名/地址填RDS的内网端点,端口填5432,再输入数据库名、RDS用户名和密码;
  3. 保存后即可通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:15:31