AWS Database Migration Serviceを使ってRDSに移行してみた話

はじめに

こんにちは、インフラDiv.の矢吹です。
PS4のモンハンやるか、やらないか迷っている今日この頃です。

今回の話

本番のEC2上で動いているWordPressのMySQLを、
RDSに持って行く過程でせっかくならAWS DMSも試してみようということで触ってみました。

当初考えていたメリット

  • レプリケーションインスタンスがEC2のMySQL更新を読み込むので移行を事実上ダウンタイムなしで出来る
  • コマンドとか一切打たなくて良いんじゃないか説

事前準備

  • テスト環境用のVPC作成
    • サブネットは二つ紐付け必要
    • DNS 解決:はい
    • DNS ホスト名:はい
  • 今回はテスト環境での実施のため、本番で動いているEC2からAMIを作成する
  • AMIよりweb,dbが一緒に入っているEC2を作成する(対象元サーバ)
  • 移行先のRDSを作成する(対象先サーバ)
    • EC2-MySQLのバージョンと出来る限り合わせる
    • EC2とは違うVPCで作成してみた(VPCが違う環境の移行が可能か試したかったため)

対象元サーバ情報

  • インスタンスタイプ
    • c4.xlarge
  • OS
    • Amazon Linux AMI release 2016.03
  • MySQLバージョン
    • mysql Ver 14.14 Distrib 5.5.56, for Linux (x86_64) using readline 5.1

対象先インスタンス情報(RDS)

DB詳細

  • DBエンジンのバージョン:mysql 5.5.57
  • インスタンスタイプ:t2.medium
  • マルチAZ配置:有効
  • ストレージタイプ:汎用(SSD)
  • ストレージ割り当て:50GB
  • DBインスタンス識別子:wordpress-yabuki
  • マスターユーザの名前:root
  • マスターパスワード:適当

データベースの設定

  • データベースの名前:wordpress (wordpress-dbじゃ作成出来なかった)
  • データベースのポート:3306
  • タグをスナップショットへコピー:いいえ
  • IAMのDB認証を有効にする:指定なし
  • 暗号を有効化:いいえ

バックアップ

  • 7日

モニタリング

  • 拡張モニタリリングを有効にする:有効

メンテナンス

  • マイナーバージョン自動アップグレード:はい

移行前の設定

  • 外部からデータを取得する権限をEC2上のMySQLに付与する
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    確認
    show grants for 'root'@'%';

  • RDS側ユーザに特権権限を付与する
    GRANT ALL PRIVILEGES ON `%`.* TO 'wordpress'@'%';
    確認
    show grants;

移行方法

AWS DMS(Data Migration Service)を利用してMySQLデータを移行
参考サイト: https://dev.classmethod.jp/cloud/aws/lets-try-aws-database-migration-service-dms/

移行手順

  1. [DMS]レプリケーションインスタンス作成
    f:id:AdwaysEngineerBlog:20180124192503p:plain

画像:レプリケーションインスタンス作成画像
f:id:AdwaysEngineerBlog:20180124192553p:plain
※VPCには二つ以上のサブネットが紐づいていないと実行出来ないらしい

  1. [DMS]ソースエンドポイント作成
    1. EC2のMySQLを設定
  2. [DMS]ターゲットエンドポイント作成
    1. RDSのMySQLを設定

画像:ソースエンドポイント,ターゲットエンドポイント作成画像 f:id:AdwaysEngineerBlog:20180124192727p:plain

※レプリケーションインスタンスに若干時間取られる。
この段階で「テストの実行」をして接続テストを行っておいた方が良い。

  1. [DMS]タスクの作成(予定)
    • ターゲットテーブル作成モード
      • 何もしない
    • レプリケーションにLOB列を含める
      • 完全LOBモード
    • LOBチャンクサイズ
      • 64
    • 検証の有効化
      • 有効
    • ロギングの有効化
      • 有効

画像:タスクの作成
f:id:AdwaysEngineerBlog:20180124192909p:plain

移行後の設定

  • wordpress-dbのテーブルにprimary keyが設定されておらず、auto_increment属性もないため設定する
    参考サイト: https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.MySQL.html#CHAP_Source.MySQL.Limitations
    PRIMARY KEY設定を行う
    ALTER TABLE `wp_posts` ADD PRIMARY KEY (`ID`);
    ALTER TABLE `wp_posts` MODIFY `ID` BIGINT(20) unsigned NOT NULL AUTO_INCREMENT;
    確認
    Show columns from wp_****;
    ※ データtrancateしないとだめな場合があるかもです。
  • MySQLの切り替えを行う(wp-config.php) /var/www/html/wp-config.php
    define('DB_NAME', 'wordpress-db');
    define('DB_HOST', 'localhost');
    ↓(RDSのパスに変更)
    define('DB_NAME', 'wordpress');
    define('DB_HOST', 'wordpress.cs**********.ap-northeast-1.rds.amazonaws.com');

考察・感想

  • メリット(良いなと思った点)
    • レプリケーションインスタンスによって常時mysqlを読み込んでくれるのは便利
      • wordpressの更新を気にせず出来る
    • 接続テストが出来るので繋がっているかどうか分かりやすい
  • デメリット(うーんって感じな点)
    • primary key,auto_increment属性等のテーブル情報が移行されないのは辛い
    • 手順が多いかも?(今回の作業ならmysqldumpの方が圧倒的に簡単でしかも早い)

mysqlの更新を止めれない場合はmysqldumpてテーブルを先に作って、AWS DMS使えばいいのかなって思います。
ではではーまたー。