AWS RDS MySQL5.6から5.7のバージョンアップのフロー

## 導入
AWS RDSのMySQLのサポートきれるよーというお知らせがきたので、アップデートを行いました。
その際の手順や、必要なドキュメントのリンクをつけながら、わかりやすくフローを書いていければなと思っています！

書くこと
・今回はダウンタイムが一定発生しても問題ない場合の方法
・全体の流れと、確認した方が良いドキュメントを記載

※絶対やってはいけないこと※
`バージョン上げてしまうと、ダウングレードして後戻りはできない`ので、
必ずスナップショットをとって、そこから旧バージョンを復元できるようにする

できるだけダウンタイムを削減したいという方は事前にリードレプリカを作成して、マスターに昇格させる、下記のやり方が良いような気がします。

[AWS RDS for MySQL5.5 => 5.6 アップグレード手順 (CLI) (2017年検証) - Qiita](https://qiita.com/ryurock/items/b1e2c53345587bfc00ff)
[MySQL DB エンジンのアップグレード](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.MySQL.html#USER_UpgradeDBInstance.MySQL.Major)

全体の流れ 
1.事前確認
2.パラメーターグループの作成
3.オプショングループの作成
4.スナップショットの取得
5.スナップショットからテスト用のDBを作成
6.即時変更で、バージョン、パラメーターグループをあげる
7.再度スナップショットを取得
8.メンテナンスウィンドウで次回のメンテナンス時にアップデートする

## 1.事前確認

5.7系へのアップグレードについて、下記のAWSの公式からの引用ですが、日付、時刻の値で新しいカラムの変更が強制されるので、ご自身のテーブルで事前にご確認ください。

MySQL バージョン 5.6.4 では、datetime、time、timestamp 列で、日付と時刻の値に小数部を使用できる新しい日付と時刻の形式が導入されました。DB インスタンスを MySQL バージョン 5.7 にアップグレードすると、MySQL はすべての日付と時刻の列のタイプを新しい形式に強制的に変換します。

[MySQL DB エンジンのアップグレード](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.MySQL.html#USER_UpgradeDBInstance.MySQL.Major)

## 2.パラメーターグループの作成

#### カスタムの設定がされている場合

データベースに対する設定を保存しておく場所になります。
複数のDBサーバーに適応可能な設定を保存することができます。

まず確認することが、アップデート対象のDBがカスタムのパラメータグループを使用しているか、デフォルトのパラメーターグループを使用しているか確認してください。

デフォルトを使用している場合は、DBの変更の際にそのままMySQL5.7のデフォルトのグループを適応すれば問題ありません。
※アップデートした際にエラーが出た場合は、デフォルトのグループはパラメーターが変更できないので、可能な限りカスタムを使用した方が良い気はします。

#### カスタムの設定がされている場合

過去の設定を比較しながら、新規に作成したパラメータグループに移植しないといけないので、下記を確認しながら、MySQL5.7用のカスタムグループを作成する。

[RDSのデフォルトパラメータグループを変更する - DENET 技術ブログ](https://blog.denet.co.jp/rds-parametergroup/)

このままAWSコンソールを見比べながら、設定か、、、と思うと気が遠くなるので、AWS CLIを使用して、パラペータグループの新旧をCSVデータで取得死して、スプレッドシート にinportして、比較しましょう

```bash
#jsonデータをCSVに書き換えるためjqをインストール
$ brew install jq

# Jsonデータで値を取得し、データの先頭にカラムのラベル追加
$ aws rds describe-db-parameters --db-parameter-group-name {パラメーターの名前}\
    | jq -r '["名前","値","許可された値","変更可能","送信元","適用タイプ","データ型","説明","ApplyMethod","MinimumEngineVersion"], (.Parameters[] | [.ParameterName,.ParameterValue,.AllowedValues,.IsModifiable,.Source,.ApplyType,.DataType,.Description,.ApplyMethod,.MinimumEngineVersion]) | @csv' \
    | iconv -t sjis \
    > {書き出しをしたいファイル名}.csv

# 作成されたファイルをスプレッドシートに突っ込めばOK
```

詳しくは下記のドキュメント。

[https://dev.classmethod.jp/articles/rds-parameter-group-export-to-csv/](https://dev.classmethod.jp/articles/rds-parameter-group-export-to-csv/)

出力された既存と新規作成したパラメーターグループを比較しながら、公式ドキュメントのリファレンスをみて、設定内容が問題ないか確認する。

version5.6
[https://dev.mysql.com/doc/refman/5.6/ja/](https://dev.mysql.com/doc/refman/5.6/ja/)
version5.7
[https://dev.mysql.com/doc/refman/5.7/en/](https://dev.mysql.com/doc/refman/5.7/en/)

## 3.オプショングループの作成
2と同様にオプショングループをMySQL5.7用のものを作成する。ここは特に引っかかるポイントはないと思います。

## 4.スナップショットの作成

下記の公式ドキュメントみながらスナップショットを取得
[https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html)

## 5.スナップショトからテスト用のDBを作成

下記の公式ドキュメントみながら、DBを作成します。
この段階ではバージョンアップはできないので、一度MySQL5.6で作成する。
[https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_RestoreFromSnapshot.html](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_RestoreFromSnapshot.html)

## 6.テスト用のDBをバージョンアップ

ドキュメントが古いですが、下記を確認して、テスト用で作成した、DBのMySQLとパラメーターグループ、オプショングループをアップデート
エラーが起きた場合は随時対応して、問題がないことを確認(雑ですみません)
[https://dev.classmethod.jp/articles/rds-for-mysql-upgrade-56-to-57/](https://dev.classmethod.jp/articles/rds-for-mysql-upgrade-56-to-57/)

## 7.再度スナップショットを取得

念のため、もう一度とっておきます。

## 8.現在稼働中のDBをバージョンアップ

手順5の再度に行った即時に反映するを選ばずに、
次回のメンテナンスウィンドウで時間を指定して実行する。
実行前後で、バックエンドの読み込み速度等を比較しながら、テスト実施を行う。
[https://dev.classmethod.jp/articles/rds-for-mysql-upgrade-56-to-57/](https://dev.classmethod.jp/articles/rds-for-mysql-upgrade-56-to-57/)


以上になります！
バージョンを単純に上げるだけならスムーズにできますが、パラメータグループやアップデートによるデータへの影響など、MySQL面で検討することが多いので、少々大変かなと思います。