CFnでプロビジョニング型からAuroraServerless v2 へ移行した話

これは [ZOZO Advent Calendar 2022](https://qiita.com/advent-calendar/2022/zozo) カレンダー Vol.3 の 16 日目の記事です。昨日の投稿は @chichi1091 さんの「[SpringBoot＋JPAからTiDBを使ってみる](https://chichi1091.hatenablog.jp/entry/2022/12/15/072354)」でした。

本記事では、CFn で管理されたプロビジョニング型の Aurora からサーバレス型のAuroraServerless v2 へ移行した話を記載します。
2022/10/5 に [AuroraServerless v2 が AWS CloudFormation(CFn) のサポートを開始した](https://aws.amazon.com/jp/about-aws/whats-new/2022/10/amazon-aurora-serverless-v2-supports-aws-cloudformation/)ことを発表しました。

元々は、 AuroraServerless v2 で構築することを考えておりましたが、CFn がサポートしていなかったためにプロビジョニング型(Aurora MySQL v3)で構築したところでした。
一方その頃、同じようなタイミングで CFn のサポートが発表されました。 「タイミングよ、、、」 と言いたいところですが、嬉しい発表なので Aurora Serverless v2 に移行することにしました。
本記事は2022年10月時点の内容になります。

基本的な作業の流れとしては下記 AWS ドキュメントに従って進めます。
ref. [プロビジョニングされたクラスターから Aurora Serverless v2 への切り替え](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.upgrade.html#aurora-serverless-v2.switch-from-provisioned)

## 前提

本記事では下記構成で実施しています。
* クラスター
    * ライターインスタンス: 1台
    * リーダーインスタンス: 1台

## 1. [CFn] クラスターに対して　Aurora Serverless v2のキャパシティ設定を追加する

[AWS::RDS::DBCluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html) に [ServerlessV2ScalingConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-rds-dbcluster-serverlessv2scalingconfiguration.html) の設定を下記のように追加し、デプロイします。
このとき、置換はFalseのため瞬断はありません。

```
ServerlessV2ScalingConfiguration:
        MinCapacity: 0.5
        MaxCapacity: 2
```

ちなみにこの設定は AuroraServerless v2 用にできたようで、[ScalingConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-scalingconfiguration) の設定ではありません。
`ScalingConfiguration` は AuroraServerless v1 用の設定になります。

クラスターに AuroraServerless v2 のキャパシティ設定が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/0a1a4370-8737-23a1-0506-99bd637e88c9.png)
この時はまだプロビジョニング型のインスタンスです。

## 2. [CFn] リーダーインスタンスを AuroraServerless v2 に変更する
コンソールから、現状リーダーとなっているインスタンスを確認し、CFnで定義している該当インスタンスの[AWS::RDS::DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbinstance.html)にてインスタンスクラスを `db.serverless` にしてデプロイします。
ref. https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.create-cluster.html

```
DBInstanceClass: "db.serverless"
```
リーダーインスタンス1台で RO のエンドポイントを使用している場合は、影響を受けるかと思います。

リーダーインスタンスが AuroraServerless v2 に変更されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/b4f46ce9-79cc-f9dc-16da-32dcf14e99b8.png)


## 3. [手動] フェイルオーバーを実施する
フェイルオーバーを実施し、AuroraServerless v2 のリーダーインスタンスをライターインスタンスに昇格させます。
このときフェイルオーバーのため、数十秒の断が発生します。

AuroraServerless v2 のインスタンスがライターに変更されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/550959d9-e3e3-6d33-f650-76e86f82831a.png)

## 4. [CFn] 残りのプロビジョニング型のインスタンスを AuroraServerless v2 に変更する
2の手順をこの時点でのリーダーインスタンスに対して実施します。

全てのインスタンスが AuroraServerless v2 に変更できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/b428a1bd-8522-ada4-ab17-20cd44de7b0b.png)

**基本的にはここまでの手順で、AuroraServerless v2 に移行することができます。**

ここからは AuroraServerless v2 を CFn管理とする際に**ハマった話**になります。

## 5. [CFn/手動] クラスターで設定していた `EngineMode` の設定は不要のため削除する
プロビジョニング型のAuroraを構築したとき、CFnにて [EngineMode](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#cfn-rds-dbcluster-enginemode)　を `provisioned` で設定していました。
サーバレス化しようと設定を見るに、`EngineMode` には `serverless` の設定値があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/f0be736e-b5ca-eb2a-46d8-400208ffbffd.png)

しかしこの設定は AuoraServerless v1 用の設定で、AuroraServerless v2 には対応していない設定のようでした。

そのため、AuoraServerless v2 にするためには`EngineMode`の設定ごと削除する必要がありました。
しかしながら、`EngineMode`の設定を削除しようとすると置換がTrueとなってしまい、作り直しが発生してしまうという状況でした。
結論としては、CFnより`EngineMode`の設定を削除した上で、CFnのImportを実施します。

### 5-1. クラスターとインスタンスをCFn管理から外す
まずは、CFnよりクラスターとインスタンスに下記のDeletionPolicyが定義されていることを確認します。
この定義がないと、リソースが削除されてしまいます。
```
DeletionPolicy: Retain
```
CFnよりクラスターとインスタンスの定義をコメントアウトしてデプロイします。
これを実行すると、CFn管理から外れてリソースだけ残ります。

### 5-2. CFnよりクラスターとインスタンスを正しい状態に修正する
CFnよりクラスターとインスタンスでコメントアウトを解除し、`EngineMode`の定義を削除します。
ここではデプロイは実施しません。

### 5-4. CFnのコンソールからスタックへのリソースのインポートを実施する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/632a15f9-8969-d00a-af7b-7b729bb03e13.png)
テンプレートファイルのアップロードより、正しい状態に修正したCFnのyamlファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/1a284bc9-1387-3801-369a-0f01bb73f08b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/9c2aadd2-6b90-c643-50ba-3a7e64e4f674.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/e3ead2a0-c9b1-c9b2-dae1-abf8ef70b7d5.png)

イベントにてステータスが`IMPORT_COMPLETE`となればImport完了です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/c254ec64-1884-3242-9797-39d7ee148d13.png)

これで無事にCFn管理することができました。

## まとめ
この記事では、CFn で管理されたプロビジョニング型の Aurora からサーバレス型のAuroraServerless v2 へ移行した話を記載しました。
CFn上では、AuroraServerless v1 と設定が異なる部分があるため注意が必要です。

## 明日は...

明日の[ZOZO Advent Calendar 2022](https://qiita.com/advent-calendar/2022/zozo) カレンダー Vol.3 の投稿は @takewell さんです。