【AWS】異なるリージョンにあるMySQLサーバに接続する方法
今回は文字だけ(笑)
例えば、アプリケーションサーバが東京リージョンにあって、DBサーバがUSリージョンにある場合でDBサーバは、public ipをもっていない場合(まあ、大概そうですが・・)この東京リージョンにあるWEBサーバからシームレスにUSリージョンのDBサーバに接続するためには、どうすればいいんでしょう?って話です。 昨今だと、AWSは、VPC ピアリング接続なんかでシームレスに異なるリージョンのVPCに接続できたりするんですが、めんどくさいとかの人向けの情報っていうか、どっちかっていうと自分の備忘録です(笑)
条件としては、
- USのVPCには、踏み台サーバがある
- DBは、PRIVATE IPしかもっていない
この条件で、USのMySQLサーバに接続する方法をざっと書いていきたいと思います
【Amazon.co.jp限定】ワコム ペンタブレット Wacom Intuos Smallワイヤレス クリスタ付き 黒 Androidにも対応 データ特典付き TCTL4100WL/K0
- 発売日: 2018/03/09
- メディア: Personal Computers
検証環境
JP サーバ(アプリケーションサーバ)
Public DNS : ec2-123-123-123-123.ap-northeast-1.compute.amazonaws.com Private IP : 10.0.0.183
US
踏み台サーバ
Public DNS : ec2-234-234-234-234.compute-1.amazonaws.com Private IP : 10.0.0.58
DBサーバ
Public DNS :なし Private IP : 10.0.1.111
設定手順
ec2-123-123-123-123にssh接続
ここは別段説明は必要ないですよね笑
$ ssh -i 11111.pem ec2-user@ec2-123-123-123-123.ap-northeast-1.compute.amazonaws.com
ec2-123-123-123-123のコンソールにて~/.ssh/config を設定
~/.ssh/config ってファイルはおそらく入っていないので、自分で作成しましょうw
$ cat << '_EOT_' >> ~/.ssh/config Host fumidai HostName ec2-234-234-234-234.compute-1.amazonaws.com User ec2-user IdentityFile ~/.ssh/55555_Private_Key.pem Host db-server HostName 10.0.1.111 User ec2-user IdentityFile ~/.ssh/22222.pem ProxyCommand ssh -W %h:%p fumidai LocalForward 13306 localhost:3306 _EOT_ $ chmod 600 ~/.ssh/config
上記の設定は、ec2-123-123-123-123のコンソールで設定したものです。 もちろんconfigファイルなんてなくても通常のssh接続にパラメータ設定すれば接続することは可能ですが、configファイルを設定すると、Hostに記載されている名前で簡単に接続できるようになります。
たとえば、上記の設定で、Host fumidaiにsshしたい場合は、
$ ssh fumidai
って書けばいいのです。
すこし話がそれましたが、今回は、ec2-123-123-123-123からシームレスにUSリージョン内にある10.0.1.111のMySQLに接続したいので、 上記で描きました、以下の部分が重要になります
Host db-server HostName 10.0.1.111 User ec2-user IdentityFile ~/.ssh/22222.pem ProxyCommand ssh -W %h:%p fumidai LocalForward 13306 localhost:3306
ざっくりポイント説明すると
Hostは、db-serverって名前にするよー ProxyCommandで、fumidai経由でdb-serverに接続するよー LocalForward の設定、DBサーバ MySQLポート:3306をec2-123-123-123-123のポート:13306にポート転送をかけるよー!
って意味になります
では、早速ポートフォワードの設定をしてみます。
## ec2-123-123-123-123のコンソールで以下のようなSSH接続をする
$ ssh -f -N db-server
細かな設定は、configに書かれていますので割愛します。
ここで重要なのが、
-f と -N のオプションです
-f. ssh 先でコマンドを実行後, バックグラウンドへと遷移するオプション
N. ssh 先でコマンドも実行しないオプション
実際このオプションをつけてsshを実行しても何もメッセージが出ないで呼び出し元コンソールに制御が戻ります でも、安心してください、ちゃんと接続できています
[ec2-user@ip-10-0-0-183 ~]$ ps -efw | grep ssh | grep -v sshd | grep -v grep ec2-user 8551 1 0 Jun14 ? 00:00:00 ssh -W 10.0.1.111:22 fumidai ec2-user 8552 1 0 Jun14 ? 00:00:00 ssh -f -N db-server
ps コマンドで以下のような結果になりましたら、接続は確立されています
MySQLへの接続
それでは、早速本題である、JP サーバからUSのprivate IPしかないDB-SERVERの接続を試してみたいと思います
[ec2-user@ip-10-0-0-183 ~]$ mysql -umyuswer -pmypassword -P13306 -h 127.0.0.1 --- Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1973816 Server version: 8.0.11 MySQL Community Server - GPL Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
無事に接続できました! ポイントは、-P13306 -h 127.0.0.1の部分です。
さきほど、~/.ssh/config の以下の部分がポイントです
LocalForward 13306 localhost:3306
これは、接続先のポート 3306をローカルホスト 13306に転送しているという意味になります なので、
[ec2-user@ip-10-0-0-183 ~]$ mysql -umyuswer -pmypassword -P13306 -h 127.0.0.1
のように、接続先の情報を書くのではなく、転送されたポートをあたかもローカルホストにあるようにしているのです! 。。とこれだけですが、接続確認はとれました。
ホスト部分を、127.0.0.1ではなく、localhostと指定した場合になぜか接続できませんでした。このあたりは知識不足なので原因がわかりません汗
以上、簡単な説明ですがこんな感じです