AWS RDSでMySQL(5.6)からAuroraに移行した記録

# はじめに
先日、運用中のサービスで利用していたAmazon RDS for MySQLを
Amazon RDS for Auroraへ移行しました。
その際の移行手順を記録しておきます。

# 前提
MySQLからAuroraへ単純に移行だけ行うのであれば、
MySQLインスタンスからスナップショットを取り、スナップショットからAuroraを立ち上げるという手順で可能です。
ただし、今回は運用中のサービスで利用しているMySQLを移行するケースだったので、
メンテナンス期間を最小限に抑えることが必要でした。
そのため、
[わずかなダウンタイムでの Amazon RDS MySQL または MariaDB DB インスタンスへのデータのインポート](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html)
を参考に、レプリケーションを利用して移行作業を行いました。
- - - 

# 作業手順
## 1, MySQLにレプリケーション用のユーザを作成する
MySQLに接続し、レプリケーション用ユーザを作成します。

<img width="267" alt="aws_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/5f86e110-c680-fc77-f728-779a83a0b8f3.png">


```sql
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl_user@'.' IDENTIFIED BY 'repl_password';
```

## 2, AWSコンソール上でMySQLにリードレプリカを作成
AWS RDSコンソール上で、MySQLインスタンスを選択し
インスタンスの操作>リードレプリカの作成　からリードレプリカを作成します。
<img width="417" alt="aws_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/240a36b0-bc39-b0f7-6933-aace269a6d15.png">

## 3, レプリケーションの停止
手順2で作成したMySQLリードレプリカに接続し、レプリケーションを止めます。
またこの時にバイナリログファイル名、バイナリログポジションを記録しておきます。

```sql
mysql> call mysql.rds_stop_replication;
mysql> show slave status\G
```
`show slave status`を実行した後に表示される
Master_Log_Fileがバイナリログファイル名、Read_Master_Log_Posがバイナリログポジションです。
※これらの情報は、後の手順でAuroraにレプリケーションを設定するときに使います。
<img width="432" alt="aws_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/c64bf391-364f-fcc3-9b26-673f66b15ba6.png">

## 4, AWSコンソール上でMySQLリードレプリカからスナップショットを取得する
AWS RDSコンソール上で、MySQLリードレプリカを選択し
インスタンスの操作>スナップショットの取得　からスナップショットを作成します。

## 5, AWSコンソール上でAuroraインスタンスを作成する
AWSコンソールのスナップショット一覧から、手順4で作成したスナップショットを選択し
「スナップショットの移行」からAuroraインスタンスを作成します。

## 6, AWSコンソール上でパラメータグループを作成
AWSコンソール上でパラメータグループ>パラメータグループの作成 からパラメータグループを作成します。

Auroraではパラメータグループが
「パラメータグループ」「DBクラスターのパラメータグループ（Auroraのクラスタ全体に設定するパラメータグループ）」
の二タイプとなったので、それぞれのタイプについて作成します。

各々のパラメータについては適宜設定します。
今回は文字コードやスロークエリログなど、MySQLのパラメータグループと合わせた形で設定しました。

## 7, AWSコンソール上でAuroraインスタンスの設定を変更
AWS RDSコンソール上で、Auroraインスタンスを選択し
インスタンスの操作>変更　からAuroraインスタンス設定を変更します。
今回は、
・パラメータグループ（手順6で設定したものにする）
・セキュリティグループ
・バックアップ
・メンテナンスウィンドウ
を変更しました。
変更の保存後、AuroraインスタンスをAWS上で再起動し、パラメータグループの変更を適用します。

## 8, MySQL->Auroraのレプリケーションを開始する
Auroraにマスターユーザで接続し、レプリケーションの設定を行います。

```sql
mysql> call mysql.rds_set_external_master (
       "MySQLのエンドポイント"
       , "ポート（通常3306）"
       , "1で作成したユーザ名"
       , "1で作成したユーザパスワード"
       , "手順3で取得したバイナリログファイル名"
       , 手順3で取得したバイナリログポジション
       , 0
       );
```
設定が終わったら、↓のコマンドでレプリケーションを開始します。

```sql
mysql> call mysql.rds_start_replication;
```
レプリケーション開始後、`show slave status\G`で確認できるSeconds_behind_masterを見て、ラグ状況を確認します。
<img width="452" alt="aws_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/a8debb59-9398-ed25-373e-e457b751a52c.png">

### 9, アプリケーションの参照系をAuroraに切り替え
アプリケーション側の参照系をAuroraに切り替えます。
問題ないようなら、AWSコンソール上でMySQLのリードレプリカを削除します。
<img width="426" alt="aws_5.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/038a3457-65fe-f511-1284-f4b5fb966e1c.png">
<img width="305" alt="aws_6.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/50283fde-1860-e460-bc0c-89de15b95d10.png">

- - -
**ここからメンテナンス期間に入ります。**

## 10, AWSコンソール上でMySQLのパラメータグループのread_onlyを1に変更
AWSコンソール上で、パラメータグループ一覧からMySQLに設定しているパラメータグループを編集し、read_onlyパラメータを1に変更します。
read_onlyパラメータは即時適用なので、
この時点からMySQLは参照はできますが更新ができなくなります。
<img width="281" alt="aws_7.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/fbdf733d-e03c-78fb-5718-af59fb428136.png">

## 11, Auroraに接続し、MySQL->Auroraのレプリケーションを停止
Auroraにマスターユーザで接続し、以下のコマンドでレプリケーションを停止します。


```sql
mysql> call mysql.rds_stop_replication;
```
※停止前に、`show slave status\G`を確認しレプリケーションラグが無いことを確認します
<img width="271" alt="aws_8_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/03df4d56-18c8-4537-7c7e-887d41228cd7.png">

## 12, アプリケーションの更新系をAuroraに切り替え
アプリケーション側の更新系をAuroraに切り替えます。
切り替えが終われば、アプリケーションでのデータベース参照・更新ともに可能になります。

<img width="302" alt="aws_9_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/e3492b9a-e436-4b4b-f2a0-a98e17148c83.png">

*ここまででメンテナンス期間が終了です。*
- - -

### 13, MySQLインスタンスの削除
しばらくサービスの監視を行い、問題ないようならMySQLインスタンスを削除します。
MySQLに接続し、レプリケーションを停止してからAWSコンソール上でインスタンス削除を行います。
<img width="263" alt="aws_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/93276/9326070a-30be-7667-75ef-6e6b0eec50cb.png">

# 補足
今回の切り替えは以上の手順で行いました。
他に移行手順の例や、うちではこうやった！　というような事例などありましたら教えて下さい。

#参考リンク
移行作業にあたって参考にさせていただいたページです。
[わずかなダウンタイムでの Amazon RDS MySQL または MariaDB DB インスタンスへのデータのインポート](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html)
[Amazon Auroraとのレプリケーション](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Aurora.Replication.html#Aurora.Overview.Replication.MySQLReplication)
[実録！サービスを止めずに Amazon Aurora へ移行した話](https://nulab-inc.com/ja/blog/nulab/migrate-to-aurora/)
[RDS for MySQLからAuroraへ移行しました](http://engineer.blog.lancers.jp/2016/01/rds-for-mysql%E3%81%8B%E3%82%89aurora%E3%81%B8%E7%A7%BB%E8%A1%8C%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F/)