Redshiftを構築するにあたって、private subnet内で構築を求められる要件はよくあるかと思います。
その場合、踏み台サーバーをpublic subnetに配置し、トンネルとして接続することになるのですが、先日のAWS System Managerのアップデートにより、セッションマネージャを利用することで踏み台サーバーをprivate subnetに配置しつつ、接続することができるようになりました。
Redshift Data APIを利用することでもアクセス可能ではありますが、cliでは容易にとはいかないですし、選択肢が増えるのは大変喜ばしいです。
以下で簡単に紹介しようと思います。
Redshift クラスタの構築
private subnet内に構築します。
コンソールにしたがってよしなに構築しましょう
踏み台EC2サーバーの構築
同じsubnet内に構築しつつ、「arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore」のpolicyを含むroleをattachしてあげましょう。
次にもしVPCエンドポイントの設定なされていない場合は
- ssm
- ssmmessages
- ec2
- ec2messages
- s3
を作成しましょう。
問題なく設定されている場合、セッションマネージャのコンソールにインスタンスが追加されます。
しかし、このバージョンのssm agentの場合、まだリモートサーバーのポートフォワーディングが対応しておらずエラーとなります。
Run commandなどを利用してアップデートしてあげましょう。
https://dev.classmethod.jp/articles/private-ec2-ssm-vpcendpoint-policy/
こちらを参照させていただきました。
Redshiftへの接続
試しにローカルより接続を試みます。
$ psql -h redshift-cluster-private.xxxxxxxx.ap-northeast-1.redshift.amazonaws.com -p 5439 -U awsuser -d dev
この状態で当然timeoutとなりました。
それでは、セッションマネージャを利用してトンネルをはります。
$ aws ssm start-session \
--target i-xxxx \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{"host":["redshift-cluster-private.ctmohfbtomhz.ap-northeast-1.redshift.amazonaws.com"],"portNumber":["5439"], "localPortNumber":["5439"]}'
この状態で、psqlで接続します。
$ psql -h redshift-cluster-private.xxxxxxxx.ap-northeast-1.redshift.amazonaws.com -p 5439 -U awsuser -d dev
Password for user awsuser:
dev=#
簡単な紹介でしたが以上となります。
private subnetで通信を完結できることから様々なユースケースに対応できるかと思います。
弊社の案件でもprivate subent内のRedshiftは多く早速利用しようと考えています。
弊社ではTableauやGCP/AWSなどのパブリッククラウドを使ったデータ分析基盤構築コンサルティングサービスやGoogleAnalytics/AdobeAnalyticsなどの各Martechツールの導入実装コンサルティングサービスを提供しております。
お問い合わせはこちらからどうぞ。