2016-05-19 21 views
1

Redshiftデータベースに接続し、ハードウェア上で実行されない膨大なクエリを実行するJavaアプリケーションを開発しています。また、アプリケーションは、データセンター内のさまざまな社内の非AWSリソース(NAS、Oracle、MySQLなどのファイル)を使用します。中間サーバー経由でRedshiftに接続

いくつかのネットワークルーティング制限のため、アプリケーションが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

私はSSH経由でトンネル(ルーカスTheisenの礼儀:https://github.com/lucastheisen/jsch-extension):データソースを作成するには、本当に簡単な方法を偶然見つけ

redshiftTunnel文字列がある
@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; 
} 

[email protected]>[email protected]{{ ec2 instance in our VPC }}|127.0.0.1:5439:{{ redshift endpoint }}:5439 
関連する問題