Session ManagerとEC2でPrivate環境にあるRedshiftに接続する

2021.07.28

はじめに

データアナリティクス事業本部のkobayashiです。

Publicサブネットを用意することができないPrivateサブネットだけの環境で手元のローカルマシーンからRedshiftへの接続を行う方法を検討したところ、Systems ManagerのSession ManagerとEC2でポートフォワードを使って接続してみましたのでその内容をまとめます。

この内容は以下のAWS公式ドキュメントを参考にしました。

また弊社ブログでAWS Systems ManagerのSession Managerを利用したポートフォワーディングのエントリがありますのこちらも併せて読んでいただけると幸いです。

構成図

接続したいRedshiftは以下の構成図のようにPrivateサブネット内にあります。VPCにPublicサブネットが用意できればNAT GatewayやPublicサブネットに踏み台のEC2を構築することでRedshiftへは接続できますが、今回の構成ではPublicサブネットを作成することができない環境ですのでSession Manager経由でPrivateサブネットにあるEC2にSSHを行いそこを踏み台にしてRedshiftへ接続してみます。

これを実現するために以下の作業を行いました。

  1. Session Manager用のVPCエンドポイントの作成
  2. EC2インスタンスの作成
  3. ~/.ssh/configファイルへの記述追加

環境

  • Amazon Linux 2
  • macOS Catalina

Session Managerでポートフォワードの設定

Privateサブネット内のEC2にSession Managerで接続するためにはVPCエンドポイントを作成する必要がありますので、マネージメントコンソールのVPCで以下のVPCエンドポイントを作成します。

  • com.amazonaws.{region}.ssm
  • com.amazonaws.{region}.ssmmessages
  • com.amazonaws.{region}.ec2
  • com.amazonaws.{region}.ec2messages

この設定によりSession ManagerからPrivateサブネットのEC2へ疎通が行えるようになります。

次にSession Manager経由でSSH接続する踏み台のEC2インスタンスを作成しますが、 この際にSession Managerを使うためのAmazonSSMManagedInstanceCore ポリシーを持つIAMロールをEC2インスタンスに割り当てるのと接続にはキーが必要になるのでキーを作成し割り当てます。

ここまで設定が終わるとマネージメントコンソールの AWS Systems Manager > Session Manager > セッションの開始 で対象のEC2インスタンスが出てくるのでAWSリソースの準備は完了です。ここの画面で対象のインスタンスが表示されない場合はエンドポイントの設定かEC2の設定に誤りがありますので再度設定を見直します。

最後にローカルマシーンからSession Manager経由でSSH接続を行いポートフォワーディングでRedshiftへ接続する設定を行います。sshコマンドを使うのですが、オプションが非常に長くなるためSSHクライアントの設定ファイル(~/.ssh/config) に接続情報を記述しておきます。

~/.ssh/configへの記述追加

Host private_redshift_conn
    ProxyCommand sh -c "aws ssm start-session --target {インスタンスID} --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --region ap-northeast-1"
    User ec2-user
    LocalForward 15439 xxxxxxxxxx.yyyyyyyyyy.ap-northeast-1.redshift.amazonaws.com:5439
    IdentityFile {秘密鍵}

~/.ssh/configに設定したHOST名で接続を試してみると、設定が正しければ以下のように接続できます。

$ ssh private_redshift_conn
Last login: Tue Jul 27 07:59:33 2021 from localhost

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-27-1-104 ~]$

Redshiftへの接続テスト

いつも使っているIntellijのDataGridで接続を試してみます。上記のsshコマンドでEC2に接続した状態でRedshiftへ接続を行います。

接続情報には以下を設定します。

  • Host : localhostを入力
  • Post : ポートフォワーディングで設定したポート番号(今回は15439)を入力
  • User : Redshiftへ接続を行うユーザー名を入力
  • Password : 上記ユーザーのパスワードを入力
  • Database : 接続を行いたいデータベース名を入力

設定を行った後にTest Connectinを押下すると接続テストが行えますが問題なく成功しています。

接続設定が行えたのでテーブルの中身を見てみるとこちらも問題なく取得できています。

今回はDataGridでの接続設定とテストを行いましたが他のDBクライアントツールでも設定情報は同じですのでpqslやDBeaverでも問題なくRedshiftへ接続を行えます。

まとめ

AWS Systems ManagerのSession ManagernのSSH接続を使ってPrivateサブネットにあるRedshiftへ接続してみました。この方法を使えばPrivateサブネットしかなくPublicサブネットにあるNAT Gatewayや踏み台EC2が使えない環境でもPrivateなRedshiftへ外部から接続できます。ただVPCエンドポイントとEC2インスタンスの利用料がかかるのでその点は注意が必要です。

最後まで読んで頂いてありがとうございました。