やってみたこと
AWS Redshift(無料トライアル)を利用してクラスターを作成し、ローカル環境のeclipseから
簡易Javaプログラム(JDBC経由)でSQL文の実行まで確認した手順を残したいと思います。
前提条件
- Redshift
- 無料トライアル版
- eclipse
- Version: 2021-06 (4.20.0)
- Java11
- JDBCドライバ(後述のJDBCドライバーを取得部分を参照)を利用してJavaからRedshiftに接続
Redshiftでクラスター作成
以下の手順にて、クラスターを作成します。
※体感ですが、10分程かかった気がします。
JDBCドライバーを取得
「Amazon Redshift」から「クラスター」を選択し、「▼ Redshiftクラスターへの接続」から
JDBCドライバーを取得する。
ローカル環境向け、Redshiftパブリックアクセス設定
初期クラスター作成時はパブリックアクセスが許可されていないため、パブリックアクセスを許可します。
① 「Amazon Redshift」から「クラスター」を選択する。
作成したクラスター名のリンクをクリック → 「アクション ▼」リンクから『パブリックアクセス可能な設定を変更』を選択。
② パブリックアクセス可能を有効化を選択し、「変更を保存」リンクをクリック。
※有効化になるまで、こちらも体感で10分程かかったような気がします。
③ ネットワークとセキュリティの設定でパブリックアクセス可能が有効化になっていればOK。
VPCセキュリティグループ設定
セキュリティグループのインバウンドルールにRedshiftを追加します。
① ネットワークとセキュリティの設定で「VPC セキュリティグループ」のリンクをクリック。
② インバウンドルールを編集し、Redshift設定を追加します。
参考:インバウンドのルールを編集
クエリエディタv2画面より、Javaから実行するSQLを確認
Javaソースコード
※import文は割愛
public class RedshiftSample {
public static final String jdbcUrl = "[参考:JDBC URLの部分]";
public static final String user = "[クラスター作成時の管理者ユーザー名]";
public static final String password = "[クラスター作成時の管理者ユーザーパスワード]";
Properties prop = new Properties();
public static void main(String[] args) {
RedshiftSample s = new RedshiftSample();
s.init();
s.execute();
}
public void init() {
prop.setProperty("user", user);
prop.setProperty("password", password);
}
public void execute() {
try (Connection con = DriverManager.getConnection(jdbcUrl, prop)) {
Class.forName("com.amazon.redshift.jdbc42.Driver"); // JDBC 4.2 互換ドライバー
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("SELECT userid FROM USERS WHERE userid < 10 ORDER BY userid;");
while (rs.next()) {
String userid = rs.getString("userid");
System.out.println("*** userid[" +userid +"]");
}
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
参考:JDBC URL
Java実行結果
お試しでハマった内容(備忘録)
AWSの知識がそこまで無かったため、Redshiftの初回クラスター作成後にパブリックアクセス可能を無効な状態で
ローカルeclipseからJava実行し、Redshiftとのコネクション失敗にハマりました・・・。
参考:Java実行時エラーログ
java.sql.SQLException: 接続試行は失敗しました。
at com.amazon.redshift.util.RedshiftException.getSQLException(RedshiftException.java:48)
at com.amazon.redshift.Driver.connect(Driver.java:303)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at jp.co.my.redshift.RedshiftSample.execute2(RedshiftSample.java:57)
at jp.co.my.redshift.RedshiftSample.main(RedshiftSample.java:20)
Caused by: java.net.SocketTimeoutException: connect timed out
at java.base/java.net.PlainSocketImpl.waitForConnect(Native Method)
at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:107)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.base/java.net.Socket.connect(Socket.java:609)
at com.amazon.redshift.core.RedshiftStream.<init>(RedshiftStream.java:86)
at com.amazon.redshift.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:101)
at com.amazon.redshift.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:214)
at com.amazon.redshift.core.ConnectionFactory.openConnection(ConnectionFactory.java:51)
at com.amazon.redshift.jdbc.RedshiftConnectionImpl.<init>(RedshiftConnectionImpl.java:288)
at com.amazon.redshift.Driver.makeConnection(Driver.java:466)
at com.amazon.redshift.Driver.connect(Driver.java:279)
... 4 more