2021/1/25 追記
5年以上放置していたのですが、未だにたまにストックされるので修正しました。
メンテされていなかったのでツールを使用した接続方法についての記述は削除しています。
前提
ローカル環境のMacからAWS上に存在するPostgresql(RDS)へ接続を行いたいが、RDSは特定のEC2等にしかポートを解放していないという場合の接続方法。
- ローカルから直接RDSに接続できない(セキュリティ的に正しい)
- 対象のRDSに接続可能なEC2は存在する(セキュリティグループの設定とかでよしなに設定されている)
- 上記のEC2にローカルからSSHできる
トンネルを掘る
ssh -N -L [ローカル側で転送に使用するPort(10000〜60000)]:[RDSのHostName]:[RDSが解放しているPort] -i [IdentityFile(秘密鍵のパス)] -p [踏み台が解放しているPort] [踏み台のUser]@[踏み台のHostName]
例:以下の条件で接続する場合
- Port:12345、秘密鍵:/User/foo/.ssh/rsa_id
- 踏み台 HostName:10.0.0.1、User:hoge、Port:22
- RDS HostName:10.0.0.2、Port:5432、User:postgres、database:dev_database
ssh -N -L 12345:10.0.0.2:5432 -i /User/foo/.ssh/rsa_id -p 22 hoge@10.0.0.1
-
-N
は、接続先でコマンドを実行しないというオプション。ポート転送を行う際に指定する。ただし、指定しなくてもいける。 -
-L
は、ポート転送を行うためのオプション。 - 踏み台へのSSH接続でconfigファイルを使用している場合は、
-i
以降を簡略化できる。(configでHost:hogehogeで「10.0.0.1」への接続を設定している場合、ssh -N -L 12345:10.0.0.2:5432 hogehoge
で接続可能)
トンネルを使って接続する
psqlコマンドを使用する
psql -h localhost -p [ローカル側で転送に使用するPort] -U [database user name] -d [database name]
一つ前の例で挙げたトンネルを使用する場合
psql -h localhost -p 12345 -U postgres -d dev_database
## **JDBC接続を行う場合** 「Host」に `localhost` 、「Port」に自分で設定した「ローカル側で転送に使用するPort」を設定する。
Hostに localhost
を設定するのが重要