AWS RDS MySQL 標準サポート終了に伴う対応

### はじめに
このドキュメントは、AWS RDS MySQL 5.7の標準サポート終了に伴い、MySQL 8.0へのアップグレードを実施するための手順をまとめたものです。
MySQLのバージョンアップに際して、事前準備から実行手順、検証、そして万が一のロールバック手順までを網羅しています。
特に、Railsを使用しているプロジェクトにおいて、互換性の確認や必要な設定変更についても触れています。MySQL 8.0への移行は、セキュリティの向上や新機能の利用など、多くのメリットがありますが、慎重な準備と計画が必要です。

### 事前準備
1. **バックアップの取得**
   - 現在のAuroraクラスタのバックアップを取得します。アップグレード中に問題が発生した場合に備えて、データを保護するために必須のステップです。
   ```shell
   aws rds create-db-cluster-snapshot --db-cluster-identifier <cluster-identifier> --db-cluster-snapshot-identifier <snapshot-identifier>
   ```

2. **互換性の確認**
   - MySQL 8.0での変更点や廃止された機能を確認し、アプリケーションが問題なく動作するかを確認します。
   - MySQL 5.7から8.0への移行ガイドラインを公式ドキュメントで確認します。
   - 使用しているRailsのバージョンがMySQL 8.0に対応しているかを確認します。**Rails 5.2以降**はMySQL 8.0をサポートしています。
https://github.com/brianmario/mysql2?tab=readme-ov-file#ruby-on-rails--active-record


### 手順

1. **パラメータグループの作成**
   - MySQL 8.0用のパラメータグループを作成し、必要な設定を行います。
   ```shell
   aws rds create-db-cluster-parameter-group \
     --db-cluster-parameter-group-name my-aurora8-parameter-group \
     --db-parameter-group-family aurora-mysql8.0 \
     --description "My Aurora MySQL 8.0 parameter group"
   ```
   - **注釈**: パラメータグループは、データベースの設定を定義するテンプレートです。新しいバージョンのMySQLに適した設定を行う必要があります。

2. **新しいパラメータグループの設定**
   - 新しいパラメータグループに適用する設定を変更します。例えば、特定の文字セットやタイムゾーンの設定など。
   ```shell
   aws rds modify-db-cluster-parameter-group \
     --db-cluster-parameter-group-name my-aurora8-parameter-group \
     --parameters "ParameterName=character_set_server,ParameterValue=utf8mb4,ApplyMethod=pending-reboot"
   ```

3. **クラスタのアップグレード**
   - クラスタを停止して、新しいバージョンへのアップグレードを開始します。
   ```shell
   aws rds modify-db-cluster \
     --db-cluster-identifier <cluster-identifier> \
     --engine-version 8.0.mysql_aurora.3 \
     --db-cluster-parameter-group-name my-aurora8-parameter-group \
     --apply-immediately
   ```
   - **注釈**: クラスタを停止してアップグレードするため、ダウンタイムが発生することを考慮してください。

4. **インスタンスのアップグレード**
   - クラスタ内の各DBインスタンスも新しいバージョンにアップグレードします。
   ```shell
   aws rds modify-db-instance \
     --db-instance-identifier <instance-identifier> \
     --db-cluster-identifier <cluster-identifier> \
     --engine-version 8.0.mysql_aurora.3 \
     --apply-immediately
   ```
   - アップグレードによる再起動で、10～15分のアクセス不可時間が生じます。
   - **注釈**: 本番のアップグレードの前に、利用者へメンテナンスの連絡および、当日はメンテナンスページを公開する準備を行い利用者への影響を最小減にします。


### 検証
1. **接続テスト**
   - アプリケーションや管理ツールを使用して新しいバージョンのデータベースに接続し、正常に動作することを確認します。
   - **注釈**: 接続テストは、すべてのアプリケーション機能が期待通りに動作することを確認するために重要です。

2. **データ整合性の確認**
   - データの整合性を確認し、必要に応じてスキーマやデータの修正を行います。特にデータ参照系(検索機能・並び替え機能など)に問題が出る可能性が高いため重点的に動作検証する必要あり。
   - **注釈**: データ整合性のチェックは、データが正確で完全であることを確認するために行います。

3. **監視とログの確認**
   - CloudWatchやRDSのログを確認し、エラーや警告が発生していないかを確認します。
   - **注釈**: ログの監視は、潜在的な問題を早期に発見するために重要です。

### ロールバック
- 何らかの理由で問題が発生した場合は、事前に取得したスナップショットから復元することができます。
  ```shell
  aws rds restore-db-cluster-from-snapshot \
    --db-cluster-identifier <new-cluster-identifier> \
    --snapshot-identifier <snapshot-identifier>
  ```
- **注釈**: ロールバック手順は、アップグレードが失敗した場合に元の状態に戻すための方法です。

### 備考
- RDS ではデフォルトのユーザー認証方式は mysql_native_password のままであるため、特別な対応は不要です。
![スクリーンショット 2024-07-18 152809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2479387/0f79f1aa-9f4b-c649-4eb2-450294a01189.png)


- 逆にローカル環境のユーザー認証方式がcaching_sha2_password となっていることがあるため、mysql_native_passwordへ変更する必要があります。(これで半日沼りました。)


### まとめ
- 以上が、RDS MySQL 標準サポート終了に伴う対応の基本的な手順です。必ず事前にバックアップを取得し、互換性の確認を行うことが重要です。また、使用しているRailsのバージョンがMySQL 8.0に対応していることを確認してください。