【问题标题】:How to connect to RDS from local JAVA program via EC2 SSH tunnel如何通过 EC2 SSH 隧道从本地 JAVA 程序连接到 RDS
【发布时间】:2020-02-06 12:31:03
【问题描述】:

我正在尝试通过 SSH 隧道从本地 JAVA 程序连接到 RDS 数据库到 EC2 实例以进行调试。我正在尝试在 EC2 实例中建立 SSH 隧道,然后将端口转发到 RDS 数据库。这是我的代码。

final int localPort = 9999;
// Create BaiscDataSource.
final String databaseURL = "jdbc:mysql://localhost:" + localPort + "/database";
// SSH Tunnel.
final JSch jsch = new JSch();
jsch.addIdentity(sshKeyPath);
this.session = jsch.getSession(ec2Username, ec2Host, 22);
this.session.setTimeout(0);
this.session.setConfig("StrictHostKeyChecking", "no");
this.session.connect();
this.session.setPortForwardingL(localPort, rdsHost, 3306);

请帮忙!

编辑者:looply_dev 2012 年 10 月 2 日下午 4:17

【问题讨论】:

  • 您还需要从 Java 设置隧道吗?在你的程序之外设置它,然后将 db URL 指向localhost:9999 不会削减它?
  • 否则这是我曾经使用过的一个工作示例。 beanizer.org/site/index.php/en/Articles/…你可能想在一个单独的线程中运行它,我不记得它是否阻塞。
  • 我实际上都试过了。在这两种情况下,执行查询都会挂起。
  • 如果你在java程序之外建立了一个隧道,然后只是简单地telnet到那个端口,你看到mysql吐出数据了吗? IE。你确定你的隧道工作正常吗?
  • 是的。确实有效。所以我想这证实了隧道是好的。

标签: java mysql ssh amazon-rds jsch


【解决方案1】:

我知道你在做什么,但没有使用 jcraft jsch 库。我能够在单独的线程上从我的 java 应用程序内部执行终端命令。这是终端命令:

ssh -i /path/to/pem/ -L -N localport:remotehost:remoteport remoteuser@remotetunnelserver.com

然后在您的 java jdbc 适配器代码中使用上面的本地端口连接 127.0.0.1

jdbc.mysql://127.0.0.1:1345/databasename/user=user&password=pass

我认为的问题是命令中的 -N 选项只创建了一个无法通过隧道执行远程命令的隧道,这在 jcraft 的 jsch 库中默认为 true,我无法将默认设置为 false来执行远程命令。

【讨论】:

  • jdbc.mysql://127.0.0.1:1345/databasename/user=user&password=pass' is not correctjdbc 部分后面必须跟 :
【解决方案2】:

我使用了 Bastion 主机并使用了本地端口转发。

ssh -i ec2key.pem -N -L 3306:my-dev-db.cluster-cdnxxxxxxxxxx.ap-southeast-1.rds.amazonaws.com:3306 ec2-user@54.253.196.193

54.253.196.193 是 bastian 主机的 IP。

最后,我使用 AWS Secrets Manager 连接到 localhost:3306。但是您也应该能够使用数据库用户名和密码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 2017-09-28
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2021-02-15
    • 2018-10-06
    • 2016-02-04
    相关资源
    最近更新 更多