share facebook facebook twitter menu hatena pocket slack

EC2でMySQL(Spider編2 リージョン間SpiderでSSL接続)

三浦 悟

WRITTEN BY 三浦 悟

少し間が空いてしまいましたが、Spiderの続きになります。
EC2でMySQL(Spider編1 Spiderってなんじゃ?)では、Spiderを使用して書き込みの分散を行いました。

今回は、Spiderによる書き込み分散をリージョン間で試してみます。

構成は以下の通りになります。(IPは仮のものです)

  • Spiderノード(Tokyoリージョン、123.123.123.123)
  • データノード1(Tokyoリージョン、111.111.111.111)
  • データノード2(EUリージョン、222.222.222.222)

また、リージョン間はインターネット接続になるため、SSLで接続するのが安全です。

インストールやデータベースの作成、セキュリティグループの設定など基本的な部分は前回と同じなので割愛します。

ちなみにこのサンプルで使用している証明書類は自前の証明書になります。

○データノードの設定
2つのデータノードで以下の設定をします。

前回と違うのは、データノードはSpiderのSSL接続先になるためのサーバー証明書の配置です。

# mkdir -p /tmp/ssl
# cd /tmp/ssl
# openssl genrsa -out ca-key.pem 2048
# openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca-cert.pem
# openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem -days 3650
# openssl rsa -in server-key.pem -out server-key.pem
# openssl x509 -req -in server-req.pem -CA ca-cert.pem -CAkey ca-key.pem -out server-cert.pem -set_serial 2 -days 3650
# chown mysql:mysql *

my.cnfで証明書の場所を追記します。

# vi /etc/my.cnf
ssl-ca=/tmp/ssl/ca-cert.pem
ssl-cert=/tmp/ssl/server-cert.pem
ssl-key=/tmp/ssl/server-key.pem

下記で、SSL接続が有効になっていることを確認します。

# mysql -u root
mysql> show variables like '%ssl%';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| have_openssl  | YES                      |
| have_ssl      | YES                      |
| ssl_ca        | /tmp/ssl/ca-cert.pem     |
| ssl_capath    |                          |
| ssl_cert      | /tmp/ssl/server-cert.pem |
| ssl_cipher    |                          |
| ssl_key       | /tmp/ssl/server-key.pem  |
+---------------+--------------------------+

そして、spiderノードのアクセスを許可します。

もし、SSL以外受け付けない場合はGRANT文の最後に REQUIRE SSLを付けます。

mysql> GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@"ja-spider" IDENTIFIED BY 'remote_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@"123.123.123.123" IDENTIFIED BY 'remote_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@"ec2-123-123-123-123.ap-northeast-1.compute.amazonaws.com" IDENTIFIED BY 'remote_pass';

最後に、memberテーブルを作成します。

mysql> use cloudpack
Database changed
mysql> create table member(
id int(11) auto_increment,
name varchar(256),
primary key(id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

○Spiderノードの設定
続いて、Spiderノードでの設定を行います。
前回との違いは、SpiderテーブルのSSLオプションと、クライアント証明書の配置です。

はじめに、証明書を作成します。

# mkdir -p /tmp/ssl
# cd /tmp/ssl
# openssl genrsa -out ca-key.pem 2048
# openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca-cert.pem
# openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client-req.pem -days 3650
# openssl rsa -in client-key.pem -out client-key.pem
# openssl x509 -req -in client-req.pem -CA ca-cert.pem -CAkey ca-key.pem -out client-cert.pem -set_serial 2 -days 3650
# chown mysql:mysql *

次に、Spiderテーブルを作成します。

まず最初に、前回と同じSSLオプションなしで作成してみます。

# mysql -u root
mysql> use cloudpack
Database changed
mysql> create table member(
id int(11) auto_increment,
name varchar(256),
primary key(id)
) engine = Spider DEFAULT CHARSET=utf8
CONNECTION ' table "member", user "remote_user", password "remote_pass" '
PARTITION BY KEY() (
    PARTITION ap_northeast_1 comment 'host "111.111.111.111", port "3306"',
    PARTITION eu_west_1 comment 'host "222.222.222.222", port "3306"'
);
Query OK, 0 rows affected (0.04 sec)

ここで、別コンソールでSpiderノードにtcpflowをインストールし、3306ポートの通信を見てみます。

コンソール2

# yum install tcpflow -y
# tcpflow -c port 3306

コンソール1で、下記のようにINSERTしてみます。

mysql> INSERT INTO member (name) VALUES('memorycraft'),('ichiro'),('jiro');

するとコンソール2では、以下のように平文で通信されていることがわかります。

046.137.176.190.03306-010.146.027.110.49671: ...........
010.146.027.110.49671-046.137.176.190.03306: .....SET NAMES utf8
046.137.176.190.03306-010.146.027.110.49669: ...........
010.146.027.110.49669-046.137.176.190.03306: 1....show table status from `cloudpack` like 'member'
046.137.176.190.03306-010.146.027.110.49671: ...........
010.146.027.110.49671-046.137.176.190.03306: @....insert into `cloudpack`.`member`(`id`,`name`)values(2,'ichiro')
046.137.176.190.03306-010.146.027.110.49669: .....*....def..TABLES..Name
TABLE_NAME.!...........(....def..TABLES..Engine.ENGINE.!...........*....def..TABLES..Version.VERSION.?...... ....0....def..TABLES.
Row_format
ROW_FORMAT.!...........*....def..TABLES..Rows
TABLE_ROWS.?...... ....8....def..TABLES..Avg_row_length.AVG_ROW_LENGTH.?...... ....2....def..TABLES..Data_length.DATA_LENGTH.?...... ....:....def..TABLES..Max_data_length.MAX_DATA_LENGTH.?...... ....4..
.def..TABLES..Index_length.INDEX_LENGTH.?...... .........def..TABLES..Data_free.DATA_FREE.?...... ....8....def..TABLES..def..TABLES..Create_time.CREATE_TIME.?...........2....def..TABLES..Update_time.UPDATE_TIME.?...........0....def..TABLES.
Check_time
CHECK_TIME.?...........4....def..TABLES..Collation.TABLE_COLLATION.!.`.........,....def..TABLES..Checksum.CHECKSUM.?...TABLE_COMMENT.!..................".Z....member.InnoDB.10.Compact.0.0.16384.0.0.4194304.1.2011-08-30 22:59:16...utf8_general_ci..........".
046.137.176.190.03306-010.146.027.110.49671: ...........
010.146.027.110.54750-046.051.243.054.03306: .....commit
046.051.243.054.03306-010.146.027.110.54750: ...........
010.146.027.110.49671-046.137.176.190.03306: .....commit
046.137.176.190.03306-010.146.027.110.49671: ...........
010.146.027.110.49671-046.137.176.190.03306: .....

ここで、コンソール1にて、SpiderノードのmemberテーブルをSSL仕様に作り直してみます。
SpiderテーブルにはMySQLのSSLオプションと同じ項目があるので、それを利用します。
以下のように、Connectionの部分にssl_ca,ssl_cert,ssl_keyの項目を追加し、それぞれに先ほど作った証明書類のパスを記載します。

mysql> DROP TABLE member;
Query OK, 0 rows affected (0.00 sec)

mysql> create table member(
id int(11) auto_increment,
name varchar(256),
primary key(id)
) engine = Spider DEFAULT CHARSET=utf8
Connection ' table "member", user "remote_user", password "remote_pass", ssl_ca "/tmp/ssl/ca-cert.pem", ssl_cert "/tmp/ssl/client-cert.pem", ssl_key "/tmp/ssl/client-key.pem" '
PARTITION BY KEY() (
    PARTITION ap_northeast_1 comment 'host "111.111.111.111", port "3306"',
    PARTITION eu_west_1 comment 'host "222.222.222.222", port "3306"'
);
Query OK, 0 rows affected (0.04 sec)

mysql> select * from member;
+----+-------------+
| id | name        |
+----+-------------+
|  1 | memorycraft |
|  3 | jiro        |
|  2 | ichiro      |
+----+-------------+
3 rows in set (3.26 sec)

ここで、コンソールを確認すると、今度は暗号化されているのがわかります。

046.137.176.190.03306-010.146.027.110.51913: .... .{..5.n.?.....~...q....K..!..h18.... %C..m...3./;.K...|g..... C046.137.176.190.03306-010.146.027.110.51913: .... Z.?.a...qU.mex ......K$...
........ #5.c.AAC.l.
'.....Q3..W+.DA[Z.6.
046.137.176.190.03306-010.146.027.110.51913: .... .
......>...XQ.e;./x..!...l7........ :/........9.=........H..vAi....F
046.137.176.190.03306-010.146.027.110.51913: .... .....j..!qr.,B-Y.e....p...]t=...... ....O....Y........Y_.+.n.9.L.TvB
046.137.176.190.03306-010.146.027.110.51913: .... ..3..'.sw..9..H....bYs.F.A....(..... /.. .Y....Yi...A..h.C....,k.w|..
010.146.027.110.51913-046.137.176.190.03306: ....p.
.)...}E8...p......o-.I.J..@%>........EW.E<.n.s..e3g.t.b....7........a......>046.137.176.190.03306-010.146.027.110.51913: .... -.,.eh.g....Z0.7..PW..a..k)..........j@........._...o.^v.Qn./.G..".vf..d...A..0,.0../.F..b..........+.J+l=.<....u>Xgj-....&W_...Y]..oL....J
010.146.027.110.49139-046.051.243.054.03306: ....0.....FOa^..K3!`.......y....9..k+.Y.e..lk.nV.g...
.t3...X....&054.03306-010.146.027.110.49139: .... .M..{.X.$Yb..q...^....PWy..M.S..... j..zGu..h.V}.#...
010.146.027.110.51913-046.137.176.190.03306: ....0$}..q.....E.......w.t..5.KW...r. eo...Ak...W..2.
046.137.176.190.03306-010.146.027.110.51913: .... .o..z...fnS..

以上で、リージョン間でも安心してSpiderが利用できます。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら

三浦 悟

三浦 悟

高円寺在住のなんじゃ系男子 またの名をmemorycraftといいます。 炭水化物大好き 日々の「なんじゃ?」を記事にしてます。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。