Blue/GreenデプロイでAuroraMySQL3にアップグレードしてみた

# はじめに
Amazon Aurora MySQL 2（MySQL5.7互換）が2024年10月31日にサポートが終了するので、Aurora MySQL 3（MySQL8互換）にバージョンアップしました。
手法は色々あるのですが、Amazon RDS がマネージドサービスとして提供する**Blue/Greenデプロイメント**が良さげでしたので手順を共有します。

# 手順
## 現状のバージョン確認
アプリケーションと同じルートからバージョンを確認します。

```
$ mysql -h foo-production.cluster-bar.ap-northeast-1.rds.amazonaws.com -u username -ppassword dbname

Server version: 5.7.12 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
```
MySQL5.7が動いていますね。

```
> select @@aurora_version;
+------------------+
| @@aurora_version |
+------------------+
| 2.11.5           |
+------------------+
```
Auroraのバージョンでいうと2でした。

## パラメータグループの作成
現在の本番環境（Blue環境）から、ステージング環境（Green環境）に、論理レプリケーションするため、予め`binlog_format`を`MIXED`に変更しておきます。
（AWSは`ROW`を推奨しているという情報もありますので公式で確認して下さい）

### 使用中のパラメータグループをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/9ed230ed-a662-54c9-85b0-99b862d320ac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/fbab1a09-f2cd-4141-5168-f5db1a64fb4c.png)

### コピーしたパラメータグループを編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/393e47cd-4b11-cfd2-4923-493e398dc405.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/28d3f773-dcf0-c974-c1b5-463e1bf95911.png)

### 変更前と変更後を比較
余計な箇所を変えていないか念の為。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/9c8120ce-b0ac-cc3b-5520-f55a1002c90f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/cc6eb5a8-a80b-f41d-f1f5-23613330fd3c.png)

メジャーバージョンアップになるので、MySQL8用のパラメータグループも準備しておかないといけません。
デフォルトの`default.aurora-mysql8.0`を基に、カスタムで修正を加えます。
修正内容は、デフォルトの`default.aurora-mysql5.7`と、使用中のパラメータグループを比較し、差分をMySQL8用に置き換えます。

## DBインスタンスを変更
作成したパラメータグループをDBインスタンスに割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/c8c3eb88-d7a2-2374-5825-4f9025befaa8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/53e7b8d3-365e-7b9d-ec84-8466a7c9732e.png)

もし、DBインスタンスクラスに`db.t3.small`を使っている場合、Aurora MySQL 3ではサポートしませんので、併せて`db.t3.medium`にアップグレードしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/c5d58772-ebe3-1646-306f-1cbc6dca23fd.png)

### DBインスタンスを再起動
変更したら、再起動して反映します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/d8dec7a1-702e-337c-2c70-b01cd5a0c9d1.png)
再起動を忘れて次に進むと、デプロイで次のエラーになりますよ！

:::note alert
Blue Green Deployments requires writer instance to be in-sync with cluster parameter group.
:::

## ブルー/グリーンデプロイの作成
本番環境を基に、Aurora MySQL 3 のステージング環境（Green環境）を作ります。

対象のDB識別子を選択し、アクションメニューから「ブルー/グリーンデプロイの作成」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/eb485bee-b1ec-c38d-6fa3-254fb13488e7.png)

ステージング環境（Green環境）の設定をします。
エンジンバージョンには、Aurora MySQL 3（MySQL 8互換）を選択します。リビジョンはAWSが推奨するもので良いと思います。
パラメータグループには、先ほど作成したMySQL8用のパラメータグループを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/c4d81dc8-5ef4-6c8f-80b3-71ef22009c6a.png)

すべて良ければ「ステージング環境の作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/43fcb888-07e7-b626-904d-ee181f637ee1.png)

作成中の画面になります。
複製後にバージョンアップも行うので、ここでは結構な時間がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/8a4395c0-9354-5037-a2ee-cbdcca21cd6a.png)

終わったらエンドポイントを確認します。
この時点で、本番環境（Blue環境）からステージング環境（Green環境）へ、論理レプリケーションが始まっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/ae0cec2c-92b0-658c-d643-faeeffd665cf.png)

Green環境のエンドポイントに接続し、バージョンを確認してみましょう。

```
$ mysql -h foo-production-green-xxx.cluster-bar.ap-northeast-1.rds.amazonaws.com -u username -ppassword dbname

Server version: 8.0.36 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
```

MySQL8で動いています。

```
> select @@aurora_version;
+------------------+
| @@aurora_version |
+------------------+
| 3.07.1           |
+------------------+
```

Auroraのバージョンでいうと3でした。

## テスト
Green環境を使って、業務チームにがんがんテストしてもらいます。

## 切り替え（スイッチオーバー）
ステージング環境（Green環境）を、新しい本番環境にプロモート（昇格）させます。

ロール「ブルー/グリーンデプロイ」のDB識別子を選択し、アクションメニューから「切り替え」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/d547e3f5-17b4-4f06-eb95-ebe029b16d82.png)
切り替えを指示すると、AWSは準備が整っているかチェックし、Blue/Green双方の書き込みをブロックしてデータ損失を防ぎます。
切り替えにかかる時間は1分程度ですが、この間、アプリがエラーを返すことがあるので、サービスの計画停止時間内に実施します。
CloudWatchがアラームを出すかもしれません。運用監視チームへの一報も忘れずに。

切り替えのタイムアウト（デフォルトは5分）より長くかかる場合、変更はすべてロールバックされ、どちらの環境にも変更は加えられません。

切り替え後、新しい本番環境に接続します。
エンドポイントは元の本番環境と同じです。

```
$ mysql -h foo-production.cluster-bar.ap-northeast-1.rds.amazonaws.com -u username -ppassword dbname
```

```
> select @@aurora_version;
+------------------+
| @@aurora_version |
+------------------+
| 3.07.1           |
+------------------+
```

アプリでも動作確認し、問題なければ古いBlue環境を削除します。