phpMyAdminから、AWS上のプライベートサブネットにあるMySQLに接続するための仕組みを構築しました。私は分析用とで利用しているだけなので、SQLクライアントで良いと思っているのですが、DBを管理するユーザーにはphpMyAdminのようなツールの方が使い勝手が良いんですかね。
phpMyAdminからMySQLへの全体像
まずは全体像です。社内からphpMyAdminを利用し、AWSのプライベートサブネット上のEC2にインストールしているMySQLに接続することが今回の目的です。
またMySQLにも繋いでみます。EC2にインストールしているMySQLに繋ぐにはMySQL Serverにもsshしなくてはいけないのでちょっと面倒です。
MySQL ServerはプライベートサブネットにあるEC2上にあるので、phpMyAdmin Serverから直接接続することができません。なのでパブリックサブネットにBastion Serverを立てます。これはAWS クラウドでの Linux 踏み台ホスト: クイックスタートリファレンスデプロイを使って簡単に構築できます。
sshポートフォワーディング(sshトンネル)を用いたMySQLへの接続
このコマンドはphpMyAdminサーバー上で実行します。実行したままにして、ずっとsshポートフォワーディングを貼ります。落ちてしまうと、ユーザーからphpMyAdminで接続できなくなってしまいます。
MySQL on EC2の場合
EC2にインストールしたMySQLへポートフォワーディングするコマンドです。
ssh -o ProxyCommand='ssh -i ~/.ssh/bastion.pem -W %h:%p ec2-user@18.222.111.001' -i ~/.ssh/mysql.pem -4 ec2-user@192.168.1.2 -fN -L 11111:localhost:3306
オプション
- -o ProxyCommand : 踏み台への接続
- %h : 接続するリモートホストのホスト名(ここでは192.168.1.2)
- %p : 接続するリモートホストのポート番号(ここでは11111)
- -i : 秘密鍵
- -4 : IPv4指定 (私の環境だと指定しないとエラーだった)
- -f : バックグラウンドで実行
- -N : ssh先で何もしない
- -fN : バックグラウンドで何もしない状態をキープすることができる
- -L : ポート転送
これで、phpMyAdmin serverにてローカルのポート11111に接続すると、sshポートフィワーディングによって、192.168.1.2のMySQLに接続できるようになります。
MySQL on RDSの場合
RDSへポートフォワーディングするコマンドです。上記に比べて、MySQL Sererへのssh接続がないので、シンプルです。
ssh -i ~/.ssh/mysql.pem -4 ec2-user@18.222.111.001 -fN -L 33333:mysql.aws.ap-northeast-1.rds.amazonaws.com:3306
ローカルのポート33333に接続すると、sshポートフィワーディングによって、mysql.aws.ap-northeast-1.rds.amazonaws.comに接続できるようになります。
phpMyAdmin Serverの設定
sshポートフォワーディングで通常のMySQLのポート3306とは異なるポートを利用しているので、phpMyAdminでもポートを変更する必要があります。上記で設定した 11111:localhost:3306
、33333:mysql.aws.ap-northeast-1.rds.amazonaws.com:3306
の左側のポート、11111と33333を設定します。
/etc/phpmyadmin/config.inc.php
に設定します。また、この設定はどんどん追加できるので、phpMyAdminで複数のサーバーへの接続もできるようになります。
/etc/phpmyadmin/config.inc.php
MySQL on EC2用
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['verbose'] = 'MySQL on EC2';
$cfg['Servers'][$i]['host'] = '127.0.0.1';
$cfg['Servers'][$i]['port'] = '11111';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = 'false';
$cfg['Servers'][$i]['AllowNoPassword'] = 'false';
MySQL on RDS用
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['verbose'] = 'MySQL on RDS';
$cfg['Servers'][$i]['host'] = '127.0.0.1';
$cfg['Servers'][$i]['port'] = '33333';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = 'false';
$cfg['Servers'][$i]['AllowNoPassword'] = 'false';
常時接続
phpMyAdminからMySQLへの接続は、sshポートフォワーディングがバックグラウンドで動いている間のみ有効です。ps aux | grep ssh
でsshのプロセスが確認できます。sshのプロセスがあるのが確認できます。
私の環境では、一定時間経つとsshポートフォワーディングが切れてしまいましたので、常時接続させるための設定をしました。
/etc/ssh/sshd_config
ClientAliveInterval 60 # 60秒毎にクライアントにメッセージを送る
ClientAliveCountMax 3 # メッセージを送ってタイムアウトだった場合に繰り返す回数
systemctl restart sshd.service
でsshdの再起動をすると、サーバーから定期的に生存確認をするので、sshポートフォワーディングが切れることがなくなります。
IPとポート番号を指定すると、Adminerからの接続もできる
sshポートフォワーディングをしておけばphpMyAdminからだけでなく、Adminerからでも接続ができます。
ただし、IP+ポート番号を入力しなくてはいけないので、システムに詳しくない人にはとっつきにくいと思います。MySQLであれば、phpMyAdminを利用した方が無難でしょうか。
踏み台を経由したRDSへのsshポートフォワーディングはすぐにできたのですが、EC2にインストールしたMySQLへの接続方法は検索してもすぐに見つけられずに苦労しました。
コメント