phpMyAdminから、sshポートフォワーディングを用いて、AWS上のプライベートサブネットにあるMySQLに接続する方法

スポンサーリンク
AWS
スポンサーリンク

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:330633333: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への接続方法は検索してもすぐに見つけられずに苦労しました。

コメント

タイトルとURLをコピーしました