通过中间服务器连接到Redshift

时间:2016-05-19 19:08:41

标签: java amazon-web-services ssh amazon-ec2 amazon-redshift

我正在开发一个连接到Redshift数据库的Java应用程序,以运行不会在我们的硬件上运行的大量查询。该应用程序还会在我们的数据中心中使用各种内部非AWS资源(例如,我们的NAS,Oracle,MySQL等文件......)。

不幸的是,由于某些网络路由限制,应用程序无法直接连接到Redshift。我可以通过SSH手动连接到我们的生产Redshift集群到属于我们的VPC的中间EC2实例 - 我希望以编程方式执行此操作。

enter image description here

在我的测试环境中,没有相同的路由限制,我可以使用如下数据源进行连接:

@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隧道?如果没有,那么“跳跃”的最佳方式是什么?通过?

1 个答案:

答案 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