AWS EC2を経由してのRDSへの接続

RDSでは、デフォルトの設定では、同じVPCに属する機器からしか接続できないようになっている。(「パブリックアクセシビリティ」が無効であり、パブリックIPが与えられていない)

運用中はセキュリティ上、その方がいいのだが。。。

開発の際にローカルサーバーから、データベースだけ本番のRDSを使ってテストを行いたい場合、困る。

もちろん、しっかりとしたテストを行うなら、本番環境をコピーしたRDSインスタンスをもう1つ立ち上げ、そのパブリックアクセシビリティを有効にする方がよりよい。

ローカルLinuxからの接続

ポートフォワーディングを利用する。

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列目がプロセス番号。

programming/web_development/server/aws/bastion.txt · 最終更新: 2019/08/02 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0