Database JUNKY

MySQL,MariaDBを中心としたブログです

【AWS】異なるリージョンにあるMySQLサーバに接続する方法

今回は文字だけ(笑)

例えば、アプリケーションサーバが東京リージョンにあって、DBサーバがUSリージョンにある場合でDBサーバは、public ipをもっていない場合(まあ、大概そうですが・・)この東京リージョンにあるWEBサーバからシームレスにUSリージョンのDBサーバに接続するためには、どうすればいいんでしょう?って話です。 昨今だと、AWSは、VPC ピアリング接続なんかでシームレスに異なるリージョンのVPCに接続できたりするんですが、めんどくさいとかの人向けの情報っていうか、どっちかっていうと自分の備忘録です(笑)

条件としては、

  • USのVPCには、踏み台サーバがある
  • DBは、PRIVATE IPしかもっていない

この条件で、USのMySQLサーバに接続する方法をざっと書いていきたいと思います

検証環境

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と指定した場合になぜか接続できませんでした。このあたりは知識不足なので原因がわかりません汗

以上、簡単な説明ですがこんな感じです

f:id:hit10231023:20180309104332j:plain