Aurora「グローバルDB」を使って災対発動を想定したDRリージョン切り替えやってみた

# 2023/9/4 追記

本記事の内容をプレゼンする機会がありましたので資料掲載しておきます。

https://speakerdeck.com/minorun365/how-to-make-dr-ready-system-with-amazon-aurora-global-database

また先月、本件関連機能のアップデートが発表され、Global Databaseの障害時フェイルオーバー操作がマネージド化されました。これはありがたいですね！

https://aws.amazon.com/jp/blogs/database/introducing-aurora-global-database-failover/


# はじめに

AWSの提供するクラウドネイティブな高性能DB「Amazon Aurora」には、グローバルDBという「リージョンまたぎでDBを同期してくれる機能」がある。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-global-database.html

これはBCP構成において非常に有用で、例えば「メインの東京リージョンで大災害が発生した際、サブの大阪リージョンにフェイルオーバーする」といったことが可能。

### グローバルDBだと何がうれしいの？

データベースの異サイト復旧を検討する際、一番面倒なのがデータの同期。
日々更新されるメインサイトのDBをサブDBにも常時複製しておかないと、有事の際にフェイルオーバーしても必要なデータが存在しなかったり、鮮度が古い（最新のデータが欠けている）とRPO要件を満たすことができない。

グローバルDBの便利なところは、この「リージョン間のDB同期」をAWSがマネージドで勝手にやってくれることである。

https://aws.amazon.com/jp/blogs/news/improving-business-continuity-with-amazon-aurora-global-database/


# 実際にやってみた

以下を実際にAWS上でハンズオンしてみる。
1. メインサイト（東京リージョン）にAuroraクラスターを構築
2. DRサイト（大阪リージョン）にレプリカを追加
3. DR発動！大阪リージョンをプライマリへ昇格
4. 東京リージョンにレプリカを再構築
5. 災害復旧。東京リージョンを再びプライマリへ昇格

### 1. メインサイト（東京リージョン）にAuroraクラスターを構築

RDSコンソールを開き「データベースの作成」を実行。
![スクリーンショット 2022-05-08 16.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/6599ade8-8c6a-a2da-a2cf-ae6417ead160.png)

標準構成でクラスターを作成。「本番稼働用」テンプレートを利用する。
今回はPostgreSQL互換エンジンを選択。
![スクリーンショット 2022-05-08 16.30.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/6d2aa604-4b13-3985-2b3c-b6b718b36d9c.png)

クラスター作成開始したら、ステータスが「利用可能」になるまで待つ。
![スクリーンショット 2022-05-08 16.32.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/8cc67d04-2ccd-0d0a-5870-072037d09dd5.png)

### 2. DRサイト（大阪リージョン）にレプリカを追加

Auroraクラスターの作成が完全に完了したら、アクション項目で「AWSリージョンを追加」がアクティブになっているのでクリック。
![スクリーンショット 2022-05-08 16.33.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/a25e0b4f-3afd-71cc-38cb-b9fa96b346d5.png)

するとグローバルDBの設定ウィザードが起動する。
「グローバルDB識別子」は、同期対象の各リージョンDBのセット全体につく一つの名前となる。
今回セカンダリリージョンには大阪を指定。またインタンスの「マルチAZ構成」も有効にしてみる。
![スクリーンショット 2022-05-08 16.36.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/5c9bb05e-7c60-7e00-b2aa-b8f9265056f8.png)

グローバルDBの作成が完了すると、マネコン上では以下のようにいろいろ増えている。
青色が元からあったクラスターで赤色が増えた部分。
![スクリーンショット 2022-05-08 18.14.23a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/8e156ff7-457b-777f-fe16-5bdb0adf9539.png)

つまり今、こういう状態である。これで災害発生前、平常時の構成が完成。
![スクリーンショット 2022-05-08 19.49.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/31cffc4a-6449-59bc-6431-01e02bc8e982.png)

### 3. DR発動！大阪リージョンをプライマリへ昇格

ここで東京リージョンで大障害が発生したと仮定し、以下の順でDRオペレーションを実施する。
- 大阪クラスターを一度、グローバルDBから脱退させる
- 脱退させた大阪クラスターをプライマリとして、新たにグローバルDBを設定する


まずは大阪クラスターを「グローバルDBから削除」する。
![スクリーンショット 2022-05-08 19.58.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/523e30e1-6665-6257-208c-d0da4e79ce4f.png)

ちなみに削除時にはポップアップで「昇格しますか？」と確認される。
つまりセカンダリクラスターをグローバルDBから削除する＝新たなグローバルDBのプライマリクラスターに昇格するということが改めて理解できる。
![スクリーンショット 2022-05-08 20.49.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/6274923c-72a5-7f87-9126-c168b5fe1e63.png)

削除が完了すると、元いたグローバルDBとは別の「レプリカクラスター」として表示される。
![スクリーンショット 2022-05-08 20.57.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/d1b2ca37-a0b4-e9c8-823d-f748fae44a96.png)

こいつはもう東京リージョンにいない亡霊のはずなので、マネコンを大阪リージョンに切り替えてみると…
レプリカではなく「リージョン別クラスター」になっていることが分かる。インスタンスも片方がライターへ昇格されている。
![スクリーンショット 2022-05-08 21.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/a603823e-7224-fe41-56e9-2afefac32b42.png)

### 4. 東京リージョンにレプリカを再構築

被災後、無事に大阪リージョンをAuroraクラスターのメインサイトに昇格できたため、しばらくは大阪メインでAuroraを稼働させることになる。その間、マルチリージョンの可用性を維持できるよう東京リージョンに大阪のレプリカを構築しておく。
もし東京復旧後にメインサイトを戻したくなった場合、そのまま東京側のレプリカをプライマリクラスターへ昇格させることも可能となる。

まずは大阪のリージョン別クラスターをグローバルDBとして再構成する。最初に東京側からグローバルDBを構成した際と同じく「AWSリージョンを追加」する。
![スクリーンショット 2022-05-08 21.17.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/7997252f-7af6-4252-420d-5100ea4bcb5c.png)

今度は東京リージョンをセカンダリにする。インスタンス構成は今回もマルチAZを選択。
![スクリーンショット 2022-05-08 21.20.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/49c7c586-999d-918f-a1a6-1b404d0d95bb.png)

すると新規グローバルDBが構成され、東京リージョン側にセカンダリクラスターが追加される。これで大阪をメインサイトとするAuroraクラスターの完全復旧が完了。
![スクリーンショット 2022-05-08 21.27.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/c4db1356-2af8-cc8f-f572-0c39838daaab.png)

### 5. 災害復旧。東京リージョンを再びプライマリへ昇格

数時間後、東京リージョンの大障害も落ち着いたらしいのでAuroraのプライマリクラスターを再度東京リージョンへ戻すこととする。
このとき、DR発動時の切り替え手順とは異なる操作を行う。

グローバルDBを選択すると、アクションに「グローバルDBをフェイルオーバー」という項目が表示される。
![スクリーンショット 2022-05-08 21.33.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/7314edce-b99f-4516-4120-e269c244d800.png)

これはDR復旧時のように計画的なフェイルオーバーを実施するのに適した「マネージドフェイルオーバー」という機能。先ほどのように手動でレプリカクラスターを除隊する手順に比べて、データ損失を完全に避けられる（RPO＝0）のがメリット。
ただし正常なグローバルDBを想定したコマンドのため実障害のフェイルオーバー用途には適さず、あくまで復旧後などの計画的なプライマリリージョン変更に利用する。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-disaster-recovery.html

ポップアップにてフェイルオーバー先のセカンダリリージョンをプルダウンで選択し、実行する。
![スクリーンショット 2022-05-08 21.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/f659a22c-b59b-d14f-da19-22cf271ef600.png)

ちなみにフェイルオーバー中は両クラスターともロールが保留中となり、DB利用が不可となる。
![スクリーンショット 2022-05-08 21.51.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/a701d2fa-6441-1175-240e-266ac45444f7.png)

今回は2〜3分でフェイルオーバーが完了。東京側のクラスターがプライマリに昇格された。
![スクリーンショット 2022-05-08 21.55.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/be97c0ca-7a3b-9f1c-1ad6-f5420dd19adb.png)


# まとめ
マルチリージョン構成なんてよっぽどミッションクリティカルな現場でしか採用されないと思われがちだが、シングルリージョン構成だと例えばDirect Connectなど特定のサービスが思わぬ可用性の泣き所となってしまう可能性もある。

せっかくAWSを使ってシステムを構築するのであれば、リレーショナルDBにはぜひ高性能なAuroraを採用し、BCP構成としてグローバルDBを活用したい。
（そしてエンプラ的にはOracle互換エンジンのサポートにも期待したいところ…！AWSさん🥺）