本番稼働中のサービスでAurora MySQL バージョン2から3 へのアップグレードをした話

本番稼働中のサービスのデータベースをアップグレードする作業を行った記録を書きます。

Aurora MySQL バージョン 3 の紹介
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.MySQL80.html#AuroraMySQL.8.0-features-community


# 方針

方針としては、既存のインスタンスのスナップショットを復元し新しくインスタンスを建てる時にAurora MySQL バージョン 3にアップグレードする方法を採用。

公式の記事を参考にしている。

インプレースアップグレードができないので、更新作業中はサービスをメンテナンス状態にして停止して実施する前提。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Updates.MajorVersionUpgrade.html#AuroraMySQL.Updates.MajorVersionUpgrade.2to3

>Aurora MySQL 2.x から 3.x へのアップグレード
現在、Aurora MySQL バージョン 3 にアップグレードするには、Aurora MySQL バージョン 2 クラスターのスナップショットを復元して、新しいバージョン 3 クラスターを作成する必要があります。下のクラスターが Aurora MySQL バージョン 1 を実行している場合は、まずバージョン 2 にアップグレードし、スナップショットの復元手法を使用してバージョン 3 クラスターを作成します。Aurora MySQL バージョン 3 およびアップグレード後に使用できる新機能に関する一般的な情報については、Aurora MySQL バージョン 3 は MYSQL 8.0 との互換性があります。 を参照してください。このタイプのアップグレードの詳細と例については、Aurora MySQL バージョン 3 のアップグレード計画 および Aurora MySQL バージョン 3 へのアップグレード を参照してください。


## Aurora MySQL バージョン 3用のパラメーターグループを事前に作成

以下２つのパラメータグループをCFnで作成

- DBクラスターのパラメータグループの作成
- DBインスタンスのパラメータグループの作成

```bash
$ ENV=prod
$ PREFIX=hoge
$ aws cloudformation create-stack \
    --stack-name ${ENV}-aurora-parameter-group \
    --template-body file://aurora_parameter_group.yml \
    --parameters ParameterKey=ENV,ParameterValue=${ENV} \
    ParameterKey=PREFIX,ParameterValue=${PREFIX} \
    --profile hoge
```


```aurora_parameter_group.yml
AWSTemplateFormatVersion: "2010-09-09"
Description:
  Create Aurora Parameter Group

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Parameters:
  ENV:
    Type: String
    AllowedValues:
      - prod
      - stg
      - dev
  PREFIX:
    Type: String

Resources:
  RDSDBClusterParameterGroup:
    Type: "AWS::RDS::DBClusterParameterGroup"
    Properties:
      Parameters:
        character_set_server: "utf8mb4"
        collation_server: "utf8mb4_unicode_ci"
        long_query_time: 1
        server_audit_logging: 1
        slow_query_log: 1
        time_zone: "Asia/Tokyo"
      Family: "aurora-mysql8.0"
      Description: !Sub "${PREFIX} ${ENV} aurora-mysql8.0 cluster Parameter Group"

  RDSDBParameterGroup:
    Type: AWS::RDS::DBParameterGroup
    Properties:
      Description: CloudFormation Sample aurora-mysql8.0 Parameter Group
      Family: "aurora-mysql8.0"
```

- 今回は特にオプショングループは使っていない


## スナップショットの復元手法
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_RestoreFromSnapshot.html

### 「アクション」から「スナップショット」を復元をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/c8c5e101-409d-310b-c88f-102c2fa50899.png)


### インスタンスを復元する際の主な設定項目

- スナップショットを元にしたインスタンス作成画面へ

### ライターインスタンスを作成
- DBインスタンス識別子の設定
- マスターユーザー、パスワード、データベース名などはスナップショットを取ったDBのものが引き継がれる

- Aurora MySQL バージョン 3系を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/5acd4234-b7b9-bab6-4ad9-f17dfb2e6479.png)


- VPC、サブネットグループ、セキュリティーグループは全て運用中のものと同じものにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/c1c83afd-0884-9b73-9eb0-cf66cb8b9194.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/092b27fe-934e-b841-fce5-29603a8982c2.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/7353e039-fef0-7101-664e-b3948632fcf8.png)


- インスタンスサイズの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/4037ba16-6d89-6fe6-983a-977573a3770a.png)

>インスタンスクラスのサポート
Aurora MySQL バージョン 3 では、Aurora MySQL バージョン 2 とは異なるインスタンスクラスのセットがサポートされています。
大規模なインスタンスの場合は、db.r5 や db.r6g、db.x2g のような最新のインスタンスクラスを使用できます。
小規模なインスタンスの場合は、db.t3 や db.t4g のような最新のインスタンスクラスを使用できます。
Aurora MySQL バージョン 2 の以下のインスタンスクラスは、Aurora MySQL バージョン 3 では使用できません。
db.r4
db.r3
db.t3.small
db.t2

- パラメータグループは事前に作ったものを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/0a026e8c-5f03-0951-be4f-9938bae15cdc.png)


- スナップショットの復元時にはマルチAZでは作れない模様なので、後からリーダーインスタンスを追加する必要がある点に注意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/ac3cd511-7976-ba65-2b5a-148ad3432e15.png)



- その他はスナップショット元の設定に準ずる


### リーダーインスタンスの追加

- クラスター内からリーダーの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/a517ae9e-c421-a54d-c7f5-ec9799f272e7.png)


## 余談

Aurora MySQL バージョン 3へのアップグレードについてクラスターのインプレースアップグレードをまだサポートしいないため、既存のクラスターやインスタンスと新しいパラメータグループを紐づけてAurora MySQL バージョン 3に更新しようとすると怒られる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/ff65161a-a9e5-89bd-008f-4644e27140dc.png)

## 参考
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_WorkingWithDBClusterParamGroups.html