我正在开发一个连接到Redshift数据库的Java应用程序,以运行不会在我们的硬件上运行的大量查询。该应用程序还会在我们的数据中心中使用各种内部非AWS资源(例如,我们的NAS,Oracle,MySQL等文件......)。
不幸的是,由于某些网络路由限制,应用程序无法直接连接到Redshift。我可以通过SSH手动连接到我们的生产Redshift集群到属于我们的VPC的中间EC2实例 - 我希望以编程方式执行此操作。
在我的测试环境中,没有相同的路由限制,我可以使用如下数据源进行连接:
@Bean(name="dataSourceRedshift")
public DataSource dataSourceRedshift() throws SQLException {
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriver(new com.amazon.redshift.jdbc41.Driver());
dataSource.setUrl("jdbc:postgresql://" + redshiftHost + ":" + redshiftPort + "/" + redshiftDatabase);
dataSource.setUsername(redshiftUser);
dataSource.setPassword(redshiftPass);
return dataSource;
}
在我的生产环境中,我无法直接连接到Redshift,是否有办法调整数据源bean(上图)以通过EC2实例设置SSH隧道?如果没有,那么“跳跃”的最佳方式是什么?通过?
答案 0 :(得分:1)
我偶然发现了一种非常简单的方法来创建一个通过SSH隧道传输的数据源(由Lucas Theisen提供:https://github.com/lucastheisen/jsch-extension):
@Bean(name="dataSourceRedshift")
public DataSource dataSourceRedshift() throws SQLException, JSchException {
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriver(new com.amazon.redshift.jdbc41.Driver());
dataSource.setUrl("jdbc:postgresql://" + redshiftHost + ":" + redshiftPort + "/" + redshiftDatabase);
dataSource.setUsername(redshiftUser);
dataSource.setPassword(redshiftPass);
DefaultSessionFactory defaultSessionFactory = new DefaultSessionFactory();
TunneledDataSourceWrapper tunneledDataSource = new TunneledDataSourceWrapper(
new TunnelConnectionManager(
defaultSessionFactory,
redshiftTunnel ),
dataSource );
return tunneledDataSource;
}
redshiftTunnel字符串是:
awoolford@localhost->awoolford@{{ ec2 instance in our VPC }}|127.0.0.1:5439:{{ redshift endpoint }}:5439