AWS Amazon RDSのバージョンアップにBlue/Greenデプロイ機能を使ってみた

## 内容

RDS AuroraのMySQLのバージョンをAurora2(MySQL5.7) ⇒ Aurora3(MySQL8.0)にアップデートする際、先日のre:Invent 2022で発表された「RDSのBlue/Greenデプロイ」という新しい機能を使用してみました。
今回その手順と、詰まったポイントをまとめていきたいと思います。
添付画像の網掛けが多い点はご容赦ください。

## 目次
- [Blue/Greenデプロイの概要](#bluegreenデプロイの概要)
- [手順](#手順)
    - [スナップショットを取得](#スナップショットを取得)
    - [Blue/Greenデプロイの作成](#bluegreenデプロイの作成)
    - [GreenのDBに変更を加える](#greenのdbに変更を加える)
    - [変更を加えたgreenのdbをテスト](#変更を加えたgreenのdbをテスト)
    - [GreenをBlueに切り替え](#greenをblueに切り替え)
    - [完了](#完了)
    - [後始末](#後始末)
- [トラブルシューティング](#トラブルシューティング)

## Blue/Greenデプロイの概要

### Blue/Greenデプロイとは

現在運用中の環境をBlueとして、レプリケーションしたステージング環境（Green環境）を用意します。
Green環境に変更を加え、変更完了後に現在のBlue環境と差し替えることで、新しい環境を反映させていく手法になります。

### RDS Blue/Greenデプロイのメリット

- すぐに運用できるステージング環境を簡単に作成できる
- データベースの変更が本番環境からステージング環境に自動的に複製される
- 本番環境に影響を与えることなく、安全なステージング環境でデータベースの変更をテストできる
- データベースのパッチとシステムの更新で最新の状態が保たれる
- 新しいデータベース機能を実装してテストできる
- アプリケーションを変更せずに、ステージング環境を新しい本番環境に切り替えられる
- 切り替えガードレール内蔵で安全に切り替えができる
- スイッチオーバー中のデータ損失を排除できる
- ワークロードにもよりますが、通常は 1 分以内ですばやく切り替えられる

### ワークフロー

RDSがプライマリのDBインスタンスの設定をコピーしてGreen環境を作成する。
Green作成時にDBエンジンのアップグレードし、Blueとは別のDBパラメータグループを指定できる。
必要に応じてGreen環境に追加の変更を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/b09cbd01-5a18-b801-8922-730bd8fc9983.png)

## 手順

### 全体像

- スナップショットを取得（バックアップ）
- 古いAuroraメジャーバージョン(blue)からクローンを実行し、古いAuroraメジャーバージョン(green)を作成
- greenのメジャーバージョンのアップグレード実行
- Auroraクラスター間で手動のMySQLバイナリログレプリケーションをセットアップして、blueからgreeenにデータの変更をレプリケーション
- green環境でスイッチオーバーの準備が整う予定のダウンタイム期間中に、blue環境を停止し、greenを新しいblueとして使用する

### スナップショットを取得

念の為スナップショットは取得しておくことをおすすめしておきます。
- RDS > データベース > 対象のDB > アクション > スナップショットの取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/e647ab80-6ac6-95a2-f4e5-938843ede281.png)


### Blue/Greenデプロイの作成

- RDS > データベース > 対象のDB > アクション > Blue/Greenデプロイの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/4221eb54-640b-3f33-5bf1-0a435fbf8cb7.png)


- 設定項目を記入
    - Blue-Green 環境識別子：Green環境とわかる名前
    - Green DBインスタンスのエンジンバージョン：この時点では現在のAuroraバージョンと合わせないとエラーとなる
    - クラスターのパラメーターグループ
    - DBインスタンスのパラメーターグループ

- 「ステージング環境の作成」押下
- 作成できたら完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/019032d5-2615-6622-e974-b9fdc1554fad.png)

※注意）[詰まりポイント１：クラスターのパラメータグループ設定変更](#詰まりポイント１クラスターのパラメータグループ設定変更)
ここで`Blue Green Deployments requires cluster parameter group has binlog enabled.`のエラーが表示される場合は、**作成元の**クラスターのパラメーターグループの`binlog_format` パラメータの値を `OFF` から `MIXED` に変更する必要があります。 

### GreenのDBに変更を加える

ここではAuroraのバージョンアップについての例を進めていきます。
Aurora2(MySQL5.7) ⇒ Aurora3(MySQL8.0)

- RDS > データベース > GreenのDBクラスター > 変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/97295a9e-eea1-66a7-84eb-03c45ae0333d.png)
- Auroraのバージョン変更
    - パラメータグループも変更する必要があれば変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/0f6f1aa2-6421-ea67-76d0-4d2863a5ff9d.png)

※注意）[詰まりポイント２：t3.small](##詰まりポイント２dbt3small)

- アップデート中
    - この期間中もアプリケーションは正常に稼働
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/5cba8539-5340-eb33-9794-71b8a2c375f1.png)

### 変更を加えたGreenのDBをテスト

必要があればRDSのエンドポイントを使用して開発環境のアプリケーションなどから動作テストなど、確認を行う。

### GreenをBlueに切り替え

- RDS > データベース > Green環境 > 変更 > 切り替え
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/fc420574-3ce7-0fbd-9098-3886a3e397c2.png)

- 内容を確認して切り替え

[詰まりポイント３）DB has a different role のエラー](#詰まりポイント３db-has-a-different-role-のエラー)

### 完了

#### RDS
下記画像のように、Greenのクラスターが昇格していれば完了。
- 古い本番環境はoldの文字列が付与されている
- 新しいSTGの「DB識別子」が本番環境に変更される
- Blue/Greenが「切り替え完了」状態になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/76fa05f0-8b93-8bc2-0983-79da57f5d844.png)

#### アプリケーション

エンドポイントの紐付けが新しいインスタンスに切り替わるため、エンドポイント自体は変わらない。
よって接続情報を変更する必要なし。

コードを何も変更せずとも、正常にアプリケーションは稼働。

### 後始末

- 新しく本番環境となったDBインスタンスの識別子を変更（必要あれば）
    - 識別子を変更するとエンドポイントが変わるため、アプリケーションやSequelの接続情報変更必要（.envの変更を反映させるまではダウンタイムが発生することになる）
- 古い環境となったDBインスタンスを削除
- ブルーグリーンデプロイメント削除

## トラブルシューティング

### 詰まりポイント１）クラスターのパラメータグループ設定変更

Blue -> Green のレプリケーションにbinlogを使用するため、**作成元の**パラメータグループを変更する必要がある。
（[>> 参考記事](https://aws.amazon.com/jp/blogs/news/new-fully-managed-blue-green-deployments-in-amazon-aurora-and-amazon-rds/#:~:text=%E3%83%96%E3%83%AB%E3%83%BC/%E3%82%B0%E3%83%AA%E3%83%BC%E3%83%B3%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E8%AD%98%E5%88%A5%E5%AD%90,%E3%81%AB%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)）

- パラメータグループ > 対象のパラメータグループ > binlog_formatをMIXEDに変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/8da5c50f-4d73-ac4d-7d96-b4c61415b13a.png)

- クラスターを再起動
    - 再起動しないと以下のエラーが出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/4c77e184-6d14-a64e-bd5f-5d88f70fb187.png)
    - 再起動時に10秒ほどダウンタイムが発生してしまうので、時間帯に注意する


### 詰まりポイント２）db.t3.small

db.t3.smallはAurora V3に非対応。
db.t3.mediumに上げる必要がある。
[DBエンジンバージョン対応表](#https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Concepts.DBInstanceClass.html)



### 詰まりポイント３）DB has a different role のエラー

GreenをBlueに切り替えようとした時に下記エラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/11345e6a-18a3-0c15-a652-48695a082247.png)

> DB instance xxx-aurora57-instance-1 has a different role than xxx-aurora57-instance-1-green-5xclwb
> (DBインスタンス xxx-aurora57-instance-1 は xxx-aurora57-instance-1-green-5xclwb とは異なる役割を持ちます。)

#### 原因

このエラーは、Greenクラスターのロールが変更されそのクラスタのライターがあるノードから別のノードに切り替わったことが原因。

#### 解決法

Greenクラスタでfailover-db-clusterを呼び出してライターにする。

- RDS > データベース > エラーが出ているdbインスタンス（ここではxxx-aurora57-1-green-5xclwb）> アクション > フェイルオーバー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/edb45869-5794-18e0-db8d-fca4c9152076.png)

- 確認画面 > フェイルオーバー

- 実行完了すると、xxx-aurora57-instance-1-green-5xclwbがライターに昇格する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692472/2fb41ff3-7b3e-6354-2e4f-babe16dc98b3.png)

- これで再度切り替えを実行すると成功する

## 最後に

Blue/Greenデプロイを実施した手順をまとめてみました。
事前設定などで怒られることが多く、今回は生じた事象と解決した方法をそのまま記述してみましたが、もっとよい解決方法などあればコメントに残していただけると幸いです。
ここまでお付き合いいただきありがとうございました。

## 参考記事

- AWS公式（英語）
    - [Blue/Greenデプロイ概要](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/blue-green-deployments-overview.html)
    - [Blue/Green デプロイメントの作成](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/blue-green-deployments-creating.html)
    - [Blue/Green デプロイメントの表示](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/blue-green-deployments-viewing.html)
    - [Blue/Green デプロイメントの切り替え](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/blue-green-deployments-switching.html)
    - [Blue/Green デプロイメントの削除](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/blue-green-deployments-deleting.html)
- AWS公式（日本語）
    - [簡単な流れと手順](https://aws.amazon.com/jp/blogs/news/new-fully-managed-blue-green-deployments-in-amazon-aurora-and-amazon-rds/)
- [DevelopersIOブログ](https://dev.classmethod.jp/articles/rds-bg-deploy/)