Redshiftでクラスター作成からローカルeclipseでSQL実行まで試した手順

## やってみたこと
AWS Redshift（無料トライアル）を利用してクラスターを作成し、ローカル環境のeclipseから
簡易Javaプログラム（JDBC経由）でSQL文の実行まで確認した手順を残したいと思います。

# 前提条件
- Redshift
  - 無料トライアル版
- eclipse
  - Version: 2021-06 (4.20.0)
  - Java11
  - JDBCドライバ（後述のJDBCドライバーを取得部分を参照）を利用してJavaからRedshiftに接続

# Redshiftでクラスター作成
以下の手順にて、クラスターを作成します。
※体感ですが、10分程かかった気がします。
![クラスタ作成①.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/85cbe7d0-ad69-61d5-45e7-9add963c55c0.png)
![クラスタ作成②.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/224c92b7-85f9-02e2-3378-dd64fb870f7b.png)

# JDBCドライバーを取得
「Amazon Redshift」から「クラスター」を選択し、「▼ Redshiftクラスターへの接続」から
JDBCドライバーを取得する。
![JDBCドライバ取得.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/6935ca90-2bcb-fdeb-212f-cf265a835273.png)

# ローカル環境向け、Redshiftパブリックアクセス設定
初期クラスター作成時はパブリックアクセスが許可されていないため、パブリックアクセスを許可します。
① 「Amazon Redshift」から「クラスター」を選択する。
　作成したクラスター名のリンクをクリック　→　「アクション ▼」リンクから『パブリックアクセス可能な設定を変更』を選択。
![パブリックアクセス設定①.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/d4f2361a-cce2-7b38-1c59-6977a55762e5.png)
② パブリックアクセス可能を有効化を選択し、「変更を保存」リンクをクリック。
※有効化になるまで、こちらも体感で10分程かかったような気がします。
![パブリックアクセス設定②.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/5768e30e-ffe5-ee9d-ca66-c02e7946dd4c.png)
③ ネットワークとセキュリティの設定でパブリックアクセス可能が有効化になっていればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/ed894b4a-2207-c0af-0fca-964e6ea38948.png)

# VPCセキュリティグループ設定
セキュリティグループのインバウンドルールにRedshiftを追加します。
① ネットワークとセキュリティの設定で「VPC セキュリティグループ」のリンクをクリック。
![セキュリティグループ設定①.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/259692b3-50c1-2b46-a85d-04aed5cba49b.png)
② インバウンドルールを編集し、Redshift設定を追加します。
![セキュリティグループ設定②.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/f69cb642-379d-76db-777f-549e48855139.png)
参考：インバウンドのルールを編集
![セキュリティグループ設定③.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/b53fbbdf-91fb-1ec0-1b4d-da8b4484760c.png)

# クエリエディタv2画面より、Javaから実行するSQLを確認
![クエリエディタv2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/f82dd467-321b-d90d-22ae-bfc56e915e9a.png)

# Javaソースコード
```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
![参考：JDBC URL.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/ef590577-4d03-7007-b500-ed27f5d4a00a.png)

# Java実行結果
![Java実行結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32811/fb99714e-7106-a12f-58ca-b3feb8d9fa8d.png)

# お試しでハマった内容（備忘録）
AWSの知識がそこまで無かったため、Redshiftの初回クラスター作成後にパブリックアクセス可能を無効な状態で
ローカルeclipseからJava実行し、Redshiftとのコネクション失敗にハマりました・・・。	

参考：Java実行時エラーログ
```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
```