Aurora Serverless V2 への移行について

オンデマンドにオートスケールするAurora Serverless v2がGAしたことに伴い、弊社でも、各プロジェクトへの導入が勧められています。

その導入過程や、手順について書いていきたいと思います。

今回紹介するのはAurora MySQL バージョン 3からAurora Serverless v2へのインプレースでのアップグレードの方法です。

現状は、Aurora MySQL バージョン 3　しかServerlessに対応していないので、インスタンスをAurora MySQL バージョン 3にしないと使えません。

Aurora MySQL バージョン 2以下のインスタンスは、一旦、Aurora MySQL バージョン 3にインプレースアップグレードしてから、移行する必要がある点にご注意ください。

ちなみに、Aurora MySQL バージョン 2からAurora MySQL バージョン 3への移行がインプレースアップグレードでできるようになったのは最近です。
https://aws.amazon.com/jp/about-aws/whats-new/2022/09/amazon-aurora-supports-in-place-upgrades-mysql-5-7-8-0/

これまではスナップショットを復元する方法しかありませんでしたので割と大変でした。
https://qiita.com/Dai_Kentaro/items/f0821de653e0f706b64e


# Aurora Sereverlessとは
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.how-it-works.html

- インスタンスのCPU、メモリ、ネットワークなどのリソースの使用率を追跡していずれのかの容量が逼迫すると自動的にスケーリングしてくれる
- 新規事業等でどれくらいのユーザーがつくかわからない時に、事前に大きめのインスタンスを用意して過剰なプロビジョニングを行う必要がなく、動的なスケーリングを行える

※注意
AWSから公式回答としては、アクセスがほとんどなくても、「Aurora Serverless v2 の CPUUtilizaton 及び ACUUtilization は完全にゼロ」になることはないそうです。アクセスがほとんどなくても、管理機構は動いているので、メトリクスのServerless Database Capacity が 0.5 で ACUUtilization が 3 程度で推移する事象は、正常な動作の範囲とのことでした。なので、自動スケーリングについては、最低ライン以上下回ることはないようです。

# 料金

https://aws.amazon.com/jp/rds/aurora/pricing/?nc1=h_ls

## 移行の手順
- 流れ
    - リーダーをサーバレス化→→→リーダーのサーバレス化完了→→→手動フェイルオーバー（ここで一瞬だけダウンタイム）→→→元ライター（現リーダー）のサーバレス化→→→元ライター（現リーダー）のサーバレス化完了


### リーダーをサーバレス化（10min程度）
- サーバレスに設定
- 容量の範囲
    - > 各 ACU が約 2 GiB のメモリに対応する

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html#aurora-serverless-v2.max_capacity_considerations

<img width="392" alt="image.png (61.0 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2022/10/06/78280/b7fba2fc-c478-4145-970c-0946a2324a6c.png">

<img width="813" alt="image.png (160.6 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2022/09/15/78280/6e055713-87c7-47fb-bee3-1ba086b66604.png">

- 変更の適用
    - すぐに適用

<img width="827" alt="image.png (108.6 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2022/09/15/78280/cab3b132-527f-464e-9a42-59c2b669660b.png">



### リーダーをサーバレス化に更新した後
- リーダーをサーバレスに変更した瞬間一旦全部のインスタンスが変更中になる
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/86d1780d-f161-1135-aa28-0689a7f0ebcb.png)

    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/0f058a12-1067-3535-c33e-69c86facb5d9.png)

    - ライターインスタンスへの接続は落ちない
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/3f05b2a8-93b7-3811-c9fd-304f5e558730.png)

    - リーダーのサーバレス化が完了するとこうなる
    - <img width="727" alt="image.png (70.4 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2022/09/15/78280/747c8b2f-4861-4e1f-9efd-959ee8d89bca.png">


### フェイルオーバー（10min程度、ダウンタイムが10s程度）
- フェイルオーバー
    - serverless化したリーダーをライターに昇格させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/64215c07-d06b-d2ec-3284-a7bb0c287aa7.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/e3130a18-d219-a0fa-8464-8e4376de76c1.png)

- 数秒だけライターが落ちた（リーダーがライターに昇格する切り替えのタイミングでちょうど落ちた模様）
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/84896d68-4db0-7160-cf90-f65755c3d6c8.png)

- フェイルオーバーしてserverless化したリーダーがライターに昇格
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/42c3468b-2e43-1c6e-6274-8803d05c751b.png)


### 元ライター（現リーダー）のサーバレス化（10min程度）
- クラスター内のインスタンスをサーバレス化してあるとクラスターの設定として反映され、同じACUしか選択しかできない模様
- <img width="820" alt="image.png (207.4 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2022/09/15/78280/fc66b4b5-689c-4345-af44-484d5d4365c5.png">
- 優先順位はTier0にする
    - Tier0 および Tier1 のリーダーインスタンスはライターインスタンスと共に自動スケーリングされていくので、ACUがライターに合わせて増加する

- 変更の適用
    - すぐに適用
    - ライターをサーバレスに変更した瞬間一旦全部のインスタンスが変更中になるのは先ほどの作業時と同じ

- 元ライター（現リーダー）のサーバレス化完了
    - <img width="716" alt="image.png (65.2 kB)" src="https://img.esa.io/uploads/production/attachments/10655/2022/09/15/78280/540b6ddc-828c-4f6c-b3c2-4176bdbcfc9c.png">


## メトリクスの確認/ACU値の調整について

Aurora Serverless v2 でのパフォーマンスとスケーリング

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html#aurora-serverless-v2.viewing.monitoring

>ACUUtilization。これは Aurora Serverless v2 での新しいメトリクスです。この値は割合 (%) で表されます。
これは、ServerlessDatabaseCapacity メトリクスの値を DB クラスターの最大 ACU 値で割った値です。このメトリクスを解釈してアクションを実行するには、以下のガイドラインを考慮してください。
このメトリクスが 100.0 値に近づいた場合、DB インスタンスは限りなく大きくスケールアップしたことになります。クラスターの最大 ACU 設定を引き上げることを検討してください。これにより、ライターとリーダーの両方の DB インスタンスを、より大きな容量にスケーリングできます。

- Serverless のデータベース容量 (カウント)
実際に使っているACUのカウントがどれくらいか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/8092c3de-e01c-3362-1d46-30b5379cc345.png)



- ACU Utilization(パーセント)
ACUの使用率について使用率が上がってきて100%に近づくと、ACUのマックスの設定値でも足りなくなってきている状態なので、自動スケールの幅を上げるためにマックス値を上げることを検討する必要がある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367608/5abc8b36-2f75-bc6b-d524-7c99b0cdd205.png)



- 最大値を上げた場合は、実際にアクセスが集中するような一時的なタイミングだけスペックが上昇するような形になるので、恒常的な予算の上昇はなさそう
- 逆に、最小値を上げると、常時、その最小値で　スペックを配備することになるので、時間単位が大きくなるので予算の上昇への影響がある
- リーダーの優先順位をTier0 および Tier1の設定にしていると、リーダーインスタンスもライターインスタンスのスケールと同調した動きになる

### 基本的なACU設定値の調整方針
- ACU Utilization(パーセント)をみて逼迫してそうならACUの最大値を上げる
- Serverless のデータベース容量 (カウント)が常時、最小値を超えているようなら、ACUの最小値を上げてみる