こんにちは。SREチーム インフラエンジニアの綿引です。

既存のシステムを刷新する際やリニューアルなどを行う時など
インフラ構成をいろいろ考えるかと思いますが、
DB のクラウド化を検討された方も中にはいらっしゃるのではないでしょうか。

メリット・デメリットはあるかとは思いますが、まずは現状のシステムから
移行可能かという点が気になるかと思います。

そこで本日はオンプレや EC2 インスタンスにインストールした MySQL から、
AWS の RDS の MySQL に移行する方法を試してみたので書いていきたいと思います。
またせっかくなのでRDSの暗号化も一緒にやってみたいと思います。

手順

今回は EC2 にインストールした MySQL から RDS に移行したいと思います。
実施した手順としては以下です。

1. RDS パラメータグループ作成
2. RDS インスタンス作成
3. EC2 レプリケーション事前準備
4. EC2 mysqldump エクスポート
5. RDS mysqldump インポート
6. EC2 → RDS レプリケーション構築
7. アプリケーション向き先変更
8. EC2 → RDS レプリケーション解除

では早速構築していきます。

1. RDSパラメータグループ作成

まずは RDS のパラメータグループの作成です。
パラメータグループとは MySQL の my.cnf のようなものです。

パラメータグループ自体はデフォルトのグループが存在するので
最初に作成しなくても RDS インスタンスを作成することができるのですが、
my.cnf に動的と静的なパラメータがあったように
中にはパラメータ変更後に再起動が必要なケースがあるため、
インスタンス作成時に適用しておくといいと思います。

パラメータグループの作成方法としては AWS コンソールにログインし、
以下の操作を行います。

「Amazon RDS」
→ 「パラメータグループ」
  → 「パラメータグループの作成」

作成が完了したら「パラメータの編集」ボタンから値を編集します。
尚、私が設定したパラメータとしては以下です。

パラメータ 設定値
time_zone Asia/Tokyo
sql_mode NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_results utf8
character_set_server utf8
skip-character-set-client-handshake 1

基本的には文字コードとtime_zone関連です。
RDS はインスタンスサイズによって、自動でパラメータを変更してくれるようなので
上記だけ設定して様子を見つつリソースが足りないなどあれば拡張していこうと思います。

2. RDS インスタンス作成

次にインスタンスの作成です。
設定やバージョン、スペックとしては以下のようにしました。
テストなのでスペックは低めにしています。

項目 設定値
エンジン MySQL
本番の予定 開発/テスト用
DBエンジンのバージョン MySQL 5.7.17
DBインスタンスのクラス db.m3.medium
ストレージタイプ マグネティック
ストレージ割り当て 5GB
DBパラメータグループ ※ 先ほど作成したパラメータグループ
暗号化を有効 はい

DBインスタンスのクラスとを赤字にしておりますが、RDS の暗号化を行うにあたって
暗号化が可能なインスタンスクラスと、そうでないインスタンスクラスが存在します。
ここを間違えてしまうと暗号化ができないのでご注意ください。

また暗号化には上記のような注意すべきポイントが幾つかあります。
例えば、暗号化は DB インスタンスの作成時のみしか有効にできないなどです。

詳細は以下の公式ページをご覧ください。

Amazon RDS リソースの暗号化

3. EC2 レプリケーション事前準備

ではレプリケーションを行うための事前準備をしていきましょう。
ここは単純に MySQL のレプリケーションを構築する方法と一緒です。

まずはレプリケーション用のユーザを作成します。

mysql> SHOW GRANTS for test@'%';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO test@`%` IDENTIFIED BY 'XXXXXXXX';
mysql> SHOW GRANTS for test@'%';

・ユーザ
+----------+----------------+
| User     | Host           |
+----------+----------------+
| test     | %              |
+----------+----------------+

・権限
+------------------------------------------------------------------+
| Grants for test@%                                                |
+------------------------------------------------------------------+
| GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'test'@'%' |
+------------------------------------------------------------------+

次にレプリケーションの設定のため my.cnf に以下を追加します。

server-id = 100
log-bin=mysql-bin

設定反映のため MySQL を再起動します。

$ sudo /etc/init.d/mysqld restart
$ mysql -uroot -p

マスタ側の設定ができているか、以下のコマンドで確認します。

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.XXXXXX |      XXX |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

4. EC2 mysqldump エクスポート

レプリケーションの事前設定が終わったら mysqldump でエクスポートを行います。

$ sudo mysqldump -u root -p --single-transaction --routines test > mysqldump-test.sql

5. RDS mysqldump インポート

次は RDS に今取得した dump ファイルをインポートします。
RDS の接続先に関しては AWS コンソールからエンドポイントと記載のある部分をご確認ください。

※ source でファイルを読み込む際は対象ファイルが、
OS側のカレントディレクトリに存在しなければならないのでご注意ください。

$ mysql -h test.ckipnlucwhuv.ap-northeast-1.rds.amazonaws.com -P 3306 -u root -p
mysql> use test;
mysql> source mysqldump-test.sql

これでインポートは完了です。

6. EC2 → RDS レプリケーション構築

次に EC2 から RDS へのレプリケーションの構築を行います。

mysql> show slave status \G
mysql> CALL mysql.rds_set_external_master ('EC2のMySQLのIP',3306,'ユーザ名','パスワード','show master statusで確認した **File**',show master statusで確認した **Position**,0);
mysql> CALL mysql.rds_start_replication;

mysql> show slave status \G

以下の項目がどちらも**Yes**であればレプリケーション構築完了です。

・Slave_IO_Running: Yes
・Slave_SQL_Running: Yes

7. アプリケーション向き先変更

アプリケーション側で EC2 の MySQL に接続しているものがあれば変更します。
アプリケーション以外にもツール系(phpMyadminなど)も注意ですね。

8. EC2 → RDS レプリケーション解除

アプリケーション側の向き先を変更したら、最後に EC2 → RDS 間の
レプリケーションを解除して移行完了です。

mysql> CALL mysql.rds_reset_external_master;
※ reset slave はこれ

因みに、、

mysql> call mysql.rds_stop_replication;
※ stopはこれ

mysql> CALL mysql.rds_skip_repl_error;
※ skipはこれ

これで移行は完了です。
作業自体は簡単ですが移行元のデータベースが巨大だったりすると結構時間がかかります。
もしサービス側で検討されている方はタイミングが重要ですね。

まとめ

今回は オンプレ・EC2 の MySQL から AWS RDS への移行を実施しました。
現在、クラウド移行を進めている方など参考にして頂ければ幸いです。

ご清覧頂きありがとうございました。
Wedding Parkでは一緒に技術のウエディングパークを創っていくエンジニアを募集しています。
興味のある方はぜひ一度気軽にオフィスに遊びにいらして頂ければと思います。

IT×ブライダルで業界を変える!プロフェッショナルなWEBエンジニア募集!

Join Us !

ウエディングパークでは、一緒に働く仲間を募集しています!
ご興味ある方は、お気軽にお問合せください(カジュアル面談から可)

採用情報を見る