RDSでは、デフォルトの設定では、同じVPCに属する機器からしか接続できないようになっている。(「パブリックアクセシビリティ」が無効であり、パブリックIPが与えられていない)
運用中はセキュリティ上、その方がいいのだが。。。
開発の際にローカルサーバーから、データベースだけ本番のRDSを使ってテストを行いたい場合、困る。
もちろん、しっかりとしたテストを行うなら、本番環境をコピーしたRDSインスタンスをもう1つ立ち上げ、そのパブリックアクセシビリティを有効にする方がよりよい。
ポートフォワーディングを利用する。
Windowsでも、仮想マシンを立ち上げてLinuxを利用している場合は、仮想マシンのLinux上で同様に行える。
ローカルLinux ⇒ AWS EC2 ⇒ AWS RDS という接続を行う。EC2とRDSは、同じVPCに属しているとする。
まず、ローカルLinux上で、以下のコマンドでEC2との接続を確立する。
$ ssh -L {LocalPort}:{RdsHost}:{RdsPort} ec2-user@{Ec2Host}
{LocalPort}
: ローカルの空いている任意のポート{RdsHost}
: EC2から見た、RDSへのホスト名{RdsPort}
: RDSで接続を待ち受けるポート(mysqlなら通常は3306){Ec2Host}
: ローカルから見た、EC2へのホスト名
これで、「ローカルLinuxからの127.0.0.1
への{LocalPort}
ポート」へのリクエストが、「EC2からの{RdsHost}
への{RdsPort}
ポート」へのリクエストに置きかえられる。
LocalPortは空いてるポートを適当に決めればよい。MySQLが一般的に3306を使うので、13306とか。
接続されたら、その接続はキープしておく。その状態で、ローカルから
$ mysql -h 127.0.0.1 -P {LocalPort} {あとユーザとかパスワードとかのオプション}
とすれば、RDSに接続できる。
PHP等を使用する場合も、PDOに同等の設定を与えればよい。
なお、RDSへの接続はあくまでEC2で行われるので、セキュリティグループなどで、ローカルからポート3306への接続許可を特別に広げる必要は無い。(ローカル⇔EC2のssh接続(22), EC2⇔RDSのmysql接続(3306)さえできればよい)
$ ssh -f -N -L {LocalPort}:{RdsHost}:{RdsPort} ec2-user@{Ec2Host} -i {sshKeyPath} ~~~~~
とすることで、バックグラウンド実行になり、接続を維持するためにコンソールウィンドウを1つ開きっぱなしにする必要が無くなる。
切断は、プロセス番号を調べ、killする。
ps aux | grep ssh kill {ProcessID}
左から2列目がプロセス番号。