如何通过EC2 SSH隧道从本地Java程序连接到RDS

3

我正在尝试通过SSH隧道连接到EC2实例上的RDS数据库,以进行调试。我尝试通过SSH隧道进入EC2实例,然后端口转发到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不行吗? - favoretti
否则,这里是我曾经使用过的一个工作示例。http://www.beanizer.org/site/index.php/en/Articles/Java-ssh-tunneling-with-jsch.html 你可能想在单独的线程中运行它,我不记得它是否阻塞了。 - favoretti
我实际上尝试了两种方法。在两种情况下,执行查询都会挂起。 - neakor
如果您在Java程序之外设置了一个隧道,然后只需简单地通过telnet连接到该端口,您是否可以看到MySQL输出数据?也就是说,您确定您的隧道工作正常吗? - favoretti
是的,那确实有效。所以我想这证实了隧道是良好的。 - neakor
显示剩余2条评论
2个回答

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库中默认为真,并且我无法将默认设置为false以执行远程命令。

jdbc.mysql://127.0.0.1:1345/databasename/user=user&password=pass' is not correct. The jdbc part must be followed by a : - Jaumzera

1
我使用了堡垒机并使用本地端口转发。
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 是堡垒主机的IP地址。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接