PHPを踏み台サーバー経由でRDSに接続させる方法


一言まとめ

WordPress開発でリモートのデータベースを使いたい!
問題は、踏み台サーバー経由じゃないとデータベースにアクセスできない…
SSHのLocal-Forward機能を使えば簡単にできる。

背景・問題点

何もWordPressに限ったことではないのですが、リモートにあるデータベースを開発者らが共有して使いたい場面は多々あると思います。多くの場合、セキュリティ上の理由でデータベースを外部(インタネット)からの接続ができないようになっていることが多いと思います。踏み台を経由しないとデータベースにアクセスできないような構成が定石ですよね。

この記事では、AWSの「EC2 + RDS」という構成を例に、ローカルマシンのPHP(WordPress)から、踏み台の向こうにあるRDSに接続させる方法を紹介できればと思います。

サーバー構成図

(本記事で使うIPアドレスなど、すべて架空のものです)
network

SSHのLocal-Forward機能を使う

MySQL Workbenchでは「TCP/IP over SSH」という接続方法があります。それを使えばたとえデータベースサーバーが踏み台サーバーの向こうにあるとしても一発で接続できて便利ですよね。PHPのSSH2拡張を使って似たようなことをPHP側で実装するのが理想ですが、WordPressを弄らないといけないし、デプロイするときに面倒そうだから、今回はSSHのLocal-Forward機能を使った方法を紹介します。

具体的には

  1. WordPress側でDBホストを127.0.0.1:3333に変更
  2. ローカルマシンでSSHを使って、ローカルの3333ポートへのパケットを踏み台サーバーを経由してRDSに転送する

という段取りです。

WordPress側の設定

wp-config.php内で

// MySQL のホスト名をローカルホストの3333ポートに変える
define('DB_HOST', '127.0.0.1:3333');

// WordPressのURLをローカルマシン用に変える
define( 'WP_HOME', 'http://localhost' );
define( 'WP_SITEURL', 'http://localhost' );

ちなみに、WordPressのURLの設定のところですが、私はローカルホストでも本番のWordPressのURLを使って開発することが多いです(※hostsファイルでマッピングを設定)。その場合はもちろんhttp://localhostではなく、本番のURLになります。みなさんも自分の環境に合わせて適宜にURLを変えて下さい。

SSHの設定

ssh \
-i ~/.ssh/id_rsa \
-p 55555 \
-L 3333:my-db.xxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306 \
-N -f \
[email protected]
-i identity_file 秘密鍵のパス
-p port リモートホスト(踏み台サーバー)に接続するためのポート。サーバー側でSSHのデフォルトのポートを変更してなければ設定する必要はない。
-L [bind_address:]port:host:hostport Local-Forwardの設定。
portはローカルホストでlistenしたいポート。
portに送られてきたパケットはリモートホスト(踏み台サーバー)に転送され、さらにリモートホストから、hostホストのhostportポートに転送される。
-N [オプション] リモートホストにログインだけして、コマンドが実行できないようにする。
-f [オプション] バックグラウンドで実行させる。
-fつきで実行した後でトンネルをやめたい場合はkillでプロセスを殺すしかないです。それが面倒なら付けないでおきましょう。
user@hostname リモートホストのユーザ名とホスト名

~/.ssh/config でコマンドを簡略化

コマンドが長いので、設定ファイルで簡略化しておくと便利です。~/.ssh/configを開いて以下を追記します。

# 踏み台サーバーと踏み台サーバートンネルの共通設定
Host bastion bastion--tunnel
    User         wang
    HostName     54.249.240.126
    IdentityFile ~/.ssh/id_rsa
    Port         55555


# 踏み台サーバートンネルの設定
Host bastion--tunnel
    LocalForward 3333 my-db.xxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306

そうすると、ssh bastion--tunnel -N -fだけでトンネルを開設することができます。

以上です!


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUTこの記事をかいた人

Hi, 中国四川出身の王です。2008年に日本に渡り、大学卒業後Web制作会社勤務を経て、現在はフリーランスとしてゆるりと働いています。サイト制作の全般を担当しています。好きな生き物はプーティ(マイCat)です。趣味はアニメ鑑賞です。画家になるのが夢だったりします!