これは ZOZO Advent Calendar 2022 カレンダー Vol.3 の 16 日目の記事です。昨日の投稿は @chichi1091 さんの「SpringBoot+JPAからTiDBを使ってみる」でした。
本記事では、CFn で管理されたプロビジョニング型の Aurora からサーバレス型のAuroraServerless v2 へ移行した話を記載します。
2022/10/5 に AuroraServerless v2 が AWS CloudFormation(CFn) のサポートを開始したことを発表しました。
元々は、 AuroraServerless v2 で構築することを考えておりましたが、CFn がサポートしていなかったためにプロビジョニング型(Aurora MySQL v3)で構築したところでした。
一方その頃、同じようなタイミングで CFn のサポートが発表されました。 「タイミングよ、、、」 と言いたいところですが、嬉しい発表なので Aurora Serverless v2 に移行することにしました。
本記事は2022年10月時点の内容になります。
基本的な作業の流れとしては下記 AWS ドキュメントに従って進めます。
ref. プロビジョニングされたクラスターから Aurora Serverless v2 への切り替え
前提
本記事では下記構成で実施しています。
- クラスター
- ライターインスタンス: 1台
- リーダーインスタンス: 1台
1. [CFn] クラスターに対して Aurora Serverless v2のキャパシティ設定を追加する
AWS::RDS::DBCluster に ServerlessV2ScalingConfiguration の設定を下記のように追加し、デプロイします。
このとき、置換はFalseのため瞬断はありません。
ServerlessV2ScalingConfiguration:
MinCapacity: 0.5
MaxCapacity: 2
ちなみにこの設定は AuroraServerless v2 用にできたようで、ScalingConfiguration の設定ではありません。
ScalingConfiguration
は AuroraServerless v1 用の設定になります。
クラスターに AuroraServerless v2 のキャパシティ設定が追加されます。
この時はまだプロビジョニング型のインスタンスです。
2. [CFn] リーダーインスタンスを AuroraServerless v2 に変更する
コンソールから、現状リーダーとなっているインスタンスを確認し、CFnで定義している該当インスタンスのAWS::RDS::DBInstanceにてインスタンスクラスを db.serverless
にしてデプロイします。
ref. https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.create-cluster.html
DBInstanceClass: "db.serverless"
リーダーインスタンス1台で RO のエンドポイントを使用している場合は、影響を受けるかと思います。
リーダーインスタンスが AuroraServerless v2 に変更されました。
3. [手動] フェイルオーバーを実施する
フェイルオーバーを実施し、AuroraServerless v2 のリーダーインスタンスをライターインスタンスに昇格させます。
このときフェイルオーバーのため、数十秒の断が発生します。
AuroraServerless v2 のインスタンスがライターに変更されました。
4. [CFn] 残りのプロビジョニング型のインスタンスを AuroraServerless v2 に変更する
2の手順をこの時点でのリーダーインスタンスに対して実施します。
全てのインスタンスが AuroraServerless v2 に変更できました。
基本的にはここまでの手順で、AuroraServerless v2 に移行することができます。
ここからは AuroraServerless v2 を CFn管理とする際にハマった話になります。
5. [CFn/手動] クラスターで設定していた EngineMode
の設定は不要のため削除する
プロビジョニング型のAuroraを構築したとき、CFnにて EngineMode を provisioned
で設定していました。
サーバレス化しようと設定を見るに、EngineMode
には serverless
の設定値があります。
しかしこの設定は 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のコンソールからスタックへのリソースのインポートを実施する
テンプレートファイルのアップロードより、正しい状態に修正したCFnのyamlファイルをアップロードします。
イベントにてステータスがIMPORT_COMPLETE
となればImport完了です!
これで無事にCFn管理することができました。
まとめ
この記事では、CFn で管理されたプロビジョニング型の Aurora からサーバレス型のAuroraServerless v2 へ移行した話を記載しました。
CFn上では、AuroraServerless v1 と設定が異なる部分があるため注意が必要です。
明日は...
明日のZOZO Advent Calendar 2022 カレンダー Vol.3 の投稿は @takewell さんです。