はじめに
AWSのRedshiftには普通にID/Passで接続する以外に、
IAMで作成したアクセスキー/シークレットキーで接続することができます。
このIAM認証を使ってのJDBC接続を試してみました。
SSOではなく、単純にアクセスキーのキーペアを使っての接続です。
接続準備
Redshiftアカウントの作成
ここでは rsuser というアカウントを作ることにします
create user rsuser password disable ;
passwordは disable と設定します。
ポリシーの作成
redshift:GetClusterCredentialsのResourceで
先ほど作成したRedshiftアカウントrsuserにのみ割り当てできるようにポリシーを記述します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "redshift:GetClusterCredentials",
"Resource": [
"arn:aws:redshift:*:*:dbuser:*/rsuser",
"arn:aws:redshift:*:*:dbgroup:*/*",
"arn:aws:redshift:*:*:dbname:*/*"
]
},
{
"Effect": "Allow",
"Action": "redshift:DescribeClusters",
"Resource": "*"
}
]
}
省略していますが、本当はリージョンやデータベース名などを制限します。
IAMユーザの作成
IAMでユーザを作成し、先ほど作成したポリシー(RedshiftIAMAuthPolicy)を割り当てます。
アクセスキーのキーペアを発行し、メモっておきます。
接続
作成したIAMユーザをRedshiftアカウントに割り当て、接続します。
JDBC文字列は以下のようになります。
- jdbc:redshift:iam:// クラスタ : ポート / データベース ?AccessKeyID= アクセスキー &SecretAccessKey= シークレットキー &DbUser= Redshiftアカウント
jdbc:redshift://~~ ではなく
jdbc:redshift:iam//~~ となることに注意してください。
Javaサンプル
import java.sql.*;
import java.util.Properties;
public class IamAuthSample{
public static void main(String[] args){
String jdbcURL = "jdbc:redshift:iam://hoge.xxxxxxxxx.ap-northeast-1.redshift.amazonaws.com:5439/database01?AccessKeyID=XXXXXXXXXXX&SecretAccessKey=YYYYYYYYYYYYYY&DbUser=rsuser";
try (Connection con = DriverManager.getConnection(jdbcURL);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from information_schema.tables;")) {
while (rs.next()) {
String catalog = rs.getString("table_catalog");
String name = rs.getString("table_name");
System.out.println("Catalog: " + catalog + ", Name: " + name);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
__getConnection()__に渡すのはjdbc文字列だけになることに注目です。
サンプルなのでAccessKeyIDなど接続情報をソースに直書きしていますが、
実際に使う場合は他から取得するなど工夫しましょう。
DBeaver
Redshiftの接続クライアントツールの比較で紹介したDBeaverで接続するときは少し工夫が必要でした。
Dbeaverのバージョンは7.0.0です。
-
新しいドライバの作成
メニュー > ドライバーマネージャー から 新規 でドライバを作成します。
ドライバ名はここではRedsfhitIAMとします。
URLテンプレートには上記のJDBC文字列をそのまま入力します。
これら以外は既存のRedshiftドライバと同じ設定にします。 -
接続の作成
メニュー > データベース > 新しい接続 > RedshiftIAM
Host、Portなどはドライバに設定したJDBC文字列に埋め込まれているので
ここで入れる文字は意味がないのですが、何か入力しないと作成できないので適当に入力します。
- 1接続ごとにそれ用の新しいドライバを作る必要があります。
- ドライバーマネージャーで コピー をするとURLテンプレートが変更できないので、新規 で作ります。