一言まとめ
WordPress開発でリモートのデータベースを使いたい!
問題は、踏み台サーバー経由じゃないとデータベースにアクセスできない…
SSHのLocal-Forward機能を使えば簡単にできる。
背景・問題点
何もWordPressに限ったことではないのですが、リモートにあるデータベースを開発者らが共有して使いたい場面は多々あると思います。多くの場合、セキュリティ上の理由でデータベースを外部(インタネット)からの接続ができないようになっていることが多いと思います。踏み台を経由しないとデータベースにアクセスできないような構成が定石ですよね。
この記事では、AWSの「EC2 + RDS」という構成を例に、ローカルマシンのPHP(WordPress)から、踏み台の向こうにあるRDSに接続させる方法を紹介できればと思います。
サーバー構成図
(本記事で使うIPアドレスなど、すべて架空のものです)
SSHのLocal-Forward機能を使う
MySQL Workbenchでは「TCP/IP over SSH」という接続方法があります。それを使えばたとえデータベースサーバーが踏み台サーバーの向こうにあるとしても一発で接続できて便利ですよね。PHPのSSH2拡張を使って似たようなことをPHP側で実装するのが理想ですが、WordPressを弄らないといけないし、デプロイするときに面倒そうだから、今回はSSHのLocal-Forward機能を使った方法を紹介します。
具体的には
- WordPress側でDBホストを
127.0.0.1:3333
に変更 - ローカルマシンで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 \ user@54.249.240.126
-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
だけでトンネルを開設することができます。
以上です!