動機

株式会社iRidgeサーバーサイドエンジニアをやっています。lighttger2505です。
Vim以外の内容を書くのは久しぶりです。

さて弊社ではメインのDBとしてMySQLを使用しています。私は入社してから幾度なくDBにアクセスしてきましたが、
少し前の私には大きな不満がありました。

DBがローカルであればmysqlコマンド一発でアクセスできるのですが、
AWS RDS上に立っているDBサーバにアクセスするには踏み台サーバにssh後、mysqlコマンドを実行したり..
踏み台サーバーにssh後、更にwebアプリケーションサーバにssh後、mysqlコマンドを実行したり...
めんどくさいですね。

以下のように様々なめんどくささがあります

  • DBサーバが遠くなればなるほどに、手間がかかる
  • mysqldumpコマンド等でダンプ取るとかdumpファイルでリストアしたりとか、いちいちscpでファイルをやり取りする必要がある
  • 踏み台等にmycliインスコされてないと自動補完が貧弱(重要)

本日はそんなときに使えるTIPSをご紹介致します。

ポートフォワーディングしてアクセスッ

重要になるのがポートフォワーディングです。
平たくいうと『特定のポートに送られてきた情報を別のサーバに飛ばす』ことです。

取り急ぎ結論だけいうと、

  1. ローカルの特定のポートに実行されるコマンドを踏み台サーバを経由してDBサーバに転送するトンネルを掘る
  2. mysqlコマンドをローカルホストの特定ポートに対して実行する

これでローカルマシンからAWS RDSのMySQLサーバにアクセスできます。

踏み台サーバ経由でDBアクセス

# 踏み台サーバを経由してDBに対してポートフォワーディング
ssh -f -N -L 3306:{DB_HOST}:3306 -i {SECRET_KEY} {SSH_USRE}@{SSH_HOST}
# 上記で割当したローカルホスト:3306に対してアクセス(ただし接続情報は最終的に接続するDBサーバ)
mysql -u {DB_USER} -D {DB_NAME} -h 127.0.0.1 -P 3306 -p

簡単?にできた!

踏み台サーバ経由でアクセスするサーバ経由でDBアクセス

# 踏み台サーバに対してポートフォワーディング
ssh -f -N -L 3306:{DB_HOST}:3306 -i {SECRET_KEY} {SSH_USRE}@{SSH_HOST} -oProxyCommand='ssh {SSH_BASTION_USRE}@{SSH_BASTION_HOST} -W %h:%p' -A
# 上記で割当したローカルホスト:3306に対してアクセス(ただし接続情報は最終的に接続するDBサーバ)
mysql -u {DB_USER} -D {DB_NAME} -h 127.0.0.1 -P 3306 -p

簡単???にできた!!!

ポートダブリ

なお、複数ポートフォワーディングしてポートがかち合うこともあるのでそんなときは以下のコマンドでkillしてください。

kill `ps aux | grep "ssh -f" | awk '{print $2;}'`

スクリプト化

最終的に以下のスクリプトをDB毎に作ってつなぎ変えてます。スマートジャナイケドネ。

# ポートフォワーディングしているプロセスをぶっころ
kill `ps aux | grep "ssh -f" | awk '{print $2;}'`
# 踏み台サーバを経由してDBに対してポートフォワーディング
ssh -f -N -L 3306:{DB_HOST}:3306 -i {SECRET_KEY} {SSH_USRE}@{SSH_HOST}
# 上記で割当したローカルホスト:3306に対してアクセス(ただし接続情報は最終的に接続するDBサーバ)
mysql -u {DB_USER} -D {DB_NAME} -h 127.0.0.1 -P 3306 -p

mycli

本筋と関係無いですが、mycliがめがっさ便利だから使うと良いと思います。

https://www.mycli.net/

  • どのSQLクライアントをも凌駕する超賢い補完
  • Syntax Highlight!!!
  • confファイルによるカスタマイズ

今後の課題

とりあえずできましたが、現状は上記の様なスクリプトファイルを環境別に作成して/usr/local/binに配置することで使い分けています。
これではあまりにも管理が雑。かつスマートじゃないので、なんらかのツールで接続情報を統合管理するなどしてもっとかっこよくやりたいものです。