DMS で AWS RDS へ継続的に移行してみた

2021.06.04

こんにちは、森田です。

今回の記事では、DMSを試すべく自身が契約しているVPSのRDBをAWSのRDSへ移行を行います。

やりたいこと

別環境のVPSのRDBをAWSのRDSに継続的に移行させます。

また、VPSのRDBはWordPressのデータが入っていますので、RDSへ移行後EC2よりアクセスし、再現できているかの確認まで行います。

Database Migration Service(DMS)とは

AWS Database Migration Service を使用すると、データベースを短期間で安全に AWS に移行できます。移行中でもソースデータベースは完全に利用可能な状態に保たれ、データベースを利用するアプリケーションのダウンタイムを最小限に抑えられます。AWS Database Migration Service は、広く普及しているほとんどの商用データベースとオープンソースデータベース間のデータ移行でご利用いただけます。 https://aws.amazon.com/jp/dms/

DMSを使用することで、実際のサービスへの影響を抑えながらデータベースの移行が可能となります。

この影響を最小限に抑える仕組みに継続的レプリケーション(CDC)があります。CDCでは移行元の変更の度、移行先へその変更を反映させることができます。

前提

移行元(ソース)
VPS さくらのVPS (EC2でも代用可)
RDB MariaDB 10.2.27


移行先(ターゲット)
RDB MariaDB 10.4.13

【DMS】レプリケーションインスタンスの設定

このレプリケーションインスタンスが、移行元にアクセスし、データの取得を行います。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/a4d25d07b98e4a1a9560ba7138a6dab8.png

defalut VPC内にインスタンスを起動されます。

作成後、パブリックIPとセキュリティグループは後ほど使用しますのでメモしておきます。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/Untitled-1.png

RDS(移行先の設定)

セキュリティグループの設定

EC2用のセキュリティグループを作成します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-03_9.59.26.png

続いて、EC2とレプリケーションインスタンスのアクセスを許可するようなRDS用のセキュリティグループ(DMS-sg)を作成します。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-03_10.48.00.png

RDSの作成

移行先のRDSの作成を行います。

今回は、MariaDBを移行させますので、MariaDBの選択

開発/テストのテンプレート選択

認証情報の設定はマスターユーザー名:root, マスターパスワード:任意

セキュリティグループは先ほど作成したDMS-sgを選択

このような設定で作成を行います。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-03_10.09.44.png

VPS(移行元の設定)

ユーザの作成

DMSで移行するにあたってユーザの作成が必要となります。

mysqlにログイン後、下記コマンドを実行します。

CREATE USER 'user'@'%' IDENTIFIED BY 'XXXXXX';
GRANT ALL ON *.* TO 'user'@'%';

ポートの解放

レプリケーションインスタンスのアクセスのみを許可するようにパブリックIPを設定します。

firewall-cmd --zone=public --permanent \
--add-rich-rule="rule family=ipv4 source address=XXXXX port protocol=tcp port=3306 accept"

firewall-cmd --reload

バイナリログの設定

上記ドキュメントのように継続的にレプリケーション(CDC)を行う場合、DBのバイナリログを有効化する必要があります。

したがって、/etc/my.cnfに以下の内容を追加します。

[mysqld]
server-id=1
log-bin=/var/log/mysql/bin_log/mysql-binarylog
log_bin_index=/var/log/mysql/bin_log/mysql-bin.list
expire_logs_days=1
binlog_format=ROW
binlog_checksum=NONE

【DMS】エンドポイントの設定

ソース(移行元)

VPSに対してエンドポイントを作成します。

移行元の設定になりますのでソースエンドポイント

エンドポイント設定では、サーバ名:VPSのパブリックIP, 先ほど作成したユーザ名とパスワード, ポート番号:3306

このような設定で作成を行います。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-03_10.12.17.png

ターゲット(移行先)

先ほど作成したRDSに対してエンドポイントを作成します。

移行先の設定になりますのでターゲットエンドポイント

RDS DB インスタンスの選択で先ほどのRDSを選択すると、自動でサーバ名などが補完されます。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-03_10.18.50.png

【DMS】データベース移行タスクの作成

最後に移行タスクの作成を行います。

先ほど作成したインスタンス、エンドポイントの選択を行います。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-03_10.26.14.png

また、移行対象のテーブルを設定しますが、今回はwordpressのテーブル全てとしました。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-03_12.43.46.png

作成後ステータスが実行中となれば問題ありません。

進行状況が100%となるまで待ちましょう。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/Untitled-2.png

上手くいかないとき

データベース移行タスクが起動しない場合、エンドポイントへの接続がうまくできないことが考えられます。

エンドポイント接続テストにてステータスを確認しましょう。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-03_12.45.39.png

動作検証

先ほど作成したセキュリティグループ(ec2-dms-demo)でインスタンスを立て、下記のユーザデータでWordPressのインストールまで行います。

#!/bin/bash

yum update -y

# amazon-linux-extrasを使用して Maria DB php をインストール
amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2

# mariadb-server , Apacheのインストール
yum install -y httpd mariadb-server
systemctl start httpd
systemctl enable httpd

# ファイルの所有権、権限を変更
usermod -a -G apache ec2-user
chown -R ec2-user:apache /var/www
chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;

# PHPの動作確認ファイル生成
echo "<!--?php phpinfo(); ?-->" > /var/www/html/phpinfo.php

# 依存ライブラリインストール
yum install php-mbstring php-xml -y

# 各サービスの再起動
systemctl restart httpd
systemctl restart php-fpm

# WordPressのインストール
wget http://ja.wordpress.org/latest-ja.tar.gz
tar xvfz latest-ja.tar.gz
cp wordpress/wp-config-sample.php wordpress/wp-config.php
cp -r wordpress /var/www/html/
chown –R ec2-user:apache /var/www/html/wordpress

インストール後、/var/www/html/wordpress/wp-config.phpの中身をRDSの設定に書き換えます。

// ** MySQL 設定 - この情報はホスティング先から入手してください。 ** //
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'VPSのテーブル名' );

/** MySQL データベースのユーザー名 */
define( 'DB_USER', 'RDSユーザ名' );

/** MySQL データベースのパスワード */
define( 'DB_PASSWORD', 'RDSパスワード' );

/** MySQL のホスト名 */
define( 'DB_HOST', 'RDSエンドポイント' );

変更後EC2のパブリックIP/wordpressに接続すると、VPSと同じ表示であることが確認できます。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-03_13.23.06.png

また、CDCを行なっていますので、VPSのWordPressで記事を追加すると、

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-03_13.41.39.png

RDSでも追加されていることが確認できます。

https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2021/06/2021-06-03_13.38.01.png

これで、DMSにて継続的レプリケーション(CDC)が行えていることが確認されました。

補足

今回は、同エンジンにて移行を行いましたが、異なるエンジンにも適用できます。

(ただし、ソースごとに制約がありますので確認する必要はあります)

参考資料