AWS RDS for MySQL ブルー／グリーンデプロイの手順(自分用メモ)

# はじめに

既に多くの先人が手順をまとめていて、それらに沿ったほうが良いですが、
やっぱり自分の言葉で書かないと自分で理解できないので備忘録として残しておきます。

# ブルー／グリーンデプロイ とは？

ブルーグリーンデプロイメントとは、現状の本番環境（ブルー）とは別に新しい本番環境（グリーン）を構築した上で、
ロードバランサーの接続先を切り替えるなどして新しい本番環境をリリースする運用方法のこと。

RDSの場合、現状の本番環境（ブルー）をレプリケーションしてステージング環境（グリーン）を自動生成してくれる。
現状の本番環境（ブルー）が稼働中でも、ダウンタイムも再起動もなく、レプリケーションは実行される。

ブルーとグリーン環境は同期されているため、データの登録、更新、削除はリアルタイムでグリーン環境に適用される。
これにより、現状の本番環境に影響を与えずにRDSの変更をテストすることができる。
ブルーとグリーンの切替（ステージング環境を本番環境に切り替える）は1分程度で完了する
( **つまり、最長で1分程度のダウンタイムが発生する** ※実際のところ、ダウンタイムは4秒ぐらいでした )

# 作業実施前に確認すること

### DBの自動バックアップを必ず有効にすること

有効でないとブルーグリーンデプロイは利用できない

**なお、自動バックアップを有効化するとRDSインスタンスの再起動が実行される**ので注意

設定の確認方法： メンテナンスとバックアップ > バックアップ > 自動バックアップ

無効になっている場合(バックアップ保持期間が0日の場合)、
バックアップ保持期間を7日などにすれば有効になる(**再起動が実行される**ので注意)

### MySQL8.0のパラメータグループをあらかじめ作っておくこと

パラメータグループの新規作成でMySQL8.0を選び、timezoneをAsia/Tokyoに変更する

※オプショングループではない。オプショングループは default:mysql-8-0 で良い

※2025.03.12 追記 もし、MySQL 8.0.41 ではなく、 MySQL 8.4.3 を選ぶ場合は、MySQL 8.4 のパラメータグループを選択してください

作成方法： 左サイドバー > パラメータグループ > パラメータグループの作成 >
パラメータグループファミリー: MySQL8.0, グループ名: {DB識別子}-mysql-80

作成後に、編集をクリックし、time_zoneをAsia/Tokyoに変更して、変更を保存をクリック

### 古いDBを削除する場合、削除保護は無効化しておくこと

削除保護の無効化は再起動が発生しない

設定の確認方法： 設定 > インスタンス > 削除保護

設定の変更方法： 変更 > 削除保護の有効化のチェックを外す > 続行 > 今すぐ適用 > 保存

### ストレージ設定の更新が必要かどうかを確認すること

ストレージ設定の更新が必要な場合、レプリカの作成に追加で1時間ほど必要になる

設定の確認方法： 設定 > インスタンス > ストレージ > ストレージファイルシステム設定 > 「アップグレード可能」 と出てたら更新が必要

# メンテナンスに必要な時間

* ストレージ設定の更新なし 約1時間
* ストレージ設定の更新あり 約2時間

※DBの作成に時間がかかるというだけで、作業拘束時間としてはどちらも20分ぐらいです。休憩に出る前にやるとちょうど良いですね

# 作業手順

※レプリカの作成は実施開始から完了まで約30分程度かかる。
(ストレージ設定の更新を行う場合、追加で1時間ほどかかる場合がある)

以下は、MySQL Ver 5.7.38 から Ver 8.0.35 にアップデートし、証明書も更新する場合の手順である

```
RDS > データベース > {DB識別子} > アクション > ブルー／グリーンデプロイの作成 - 新規
```

※ブルー／グリーンデプロイを実行するには、RDSインスタンスが実行中である必要がある

### ブルー／グリーンデプロイ識別子

```
{DB識別子}-bg
test-qwe001-database-name-1-bg
```

### ブルー/グリーンデプロイ設定

```
グリーンデータベースのエンジンバージョンを選択します。
デフォルト - MySQL 8.0.35 - 推奨

グリーンデータベースの DB パラメータグループを選択します。
{DB識別子}-mysql80 ※あらかじめ作成したパラメータグループを指定

RDS Optimized Writes
デフォルト - チェックしない(グリーンデータベースで Optimized Writes を有効にする をチェックしない)

インスタンスのストレージファイルシステムのアップグレード
デフォルト - チェックしたまま
※【注意】ストレージファイルシステムのアップグレードを実行すると、レプリケーションの作成時間が1時間ぐらい伸びる
※実際にやってみたところ、ストレージ設定の更新には「40分」かかった

Blue DB instance class [Blue]
デフォルト - db.t2.micro (変更できない)

Enable Optimized Writes on green database

デフォルト - チェックしない
```

ここまで出来たら「ステージング環境の作成」をクリック

まずは現在のMySQLのバージョン(v5.7.38)でレプリカが作られる。
ステータスが「利用可能」になった後、すぐに「アップグレード」になり、
MySQLのバージョンがVer8.0.35になる。

※最初にdefault:mysql-5-7 のオプショングループが適用されて、
後から default:mysql-8-0 のオプショングループが自動生成されて適用された後、
default:mysql-5-7 を適用除外する模様

このレプリケーション中、現行のRDSは当然に接続可能。

# 証明書の更新

※2024年2月現在はデフォルトの証明書が rds-ca-rsa2048-g1になったため、レプリケーションで作る場合はこの作業が不要

左サイドバー > 証明書の更新 > {DB識別子}-green-{環境識別子} > 今すぐ適用

rds-ca-rsa2048-g1 > 確認

MySQL 8系では証明書の更新に際し、インスタンスの再起動は発生しない。

メモ：MySQL8系で出る警告エラー(対応不要)

```
[Warning] [MY-010918] [Server] 'default_authentication_plugin' is deprecated and will be removed in a future release. Please use authentication_policy instead.
[Warning] [MY-011070] [Server] 'binlog_format' is deprecated and will be removed in a future release.
[Warning] [MY-011068] [Server] The syntax 'log_slave_updates' is deprecated and will be removed in a future release. Please use log_replica_updates instead.
[Warning] [MY-011069] [Server] The syntax '--master-info-repository' is deprecated and will be removed in a future release.
[Warning] [MY-011069] [Server] The syntax '--master-info-repository' is deprecated and will be removed in a future release.
[Warning] [MY-011069] [Server] The syntax '--relay-log-info-file' is deprecated and will be removed in a future release.
[Warning] [MY-011069] [Server] The syntax '--relay-log-info-repository' is deprecated and will be removed in a future release.
[Warning] [MY-011068] [Server] The syntax 'skip_slave_start' is deprecated and will be removed in a future release. Please use skip_replica_start instead.
[Warning] [MY-011068] [Server] The syntax 'slave_exec_mode' is deprecated and will be removed in a future release. Please use replica_exec_mode instead.
[Warning] [MY-011068] [Server] The syntax 'slave_load_tmpdir' is deprecated and will be removed in a future release. Please use replica_load_tmpdir instead.
[Warning] [MY-012191] [InnoDB] Scan path '/rdsdbdata/db/innodb' is ignored because it is a sub-directory of '/rdsdbdata/db/'
[Warning] [MY-014067] [Server] Value for option 'ssl-cipher' contains cipher 'DHE-DSS-AES256-SHA' that is either blocked or deprecated (and will be removed in a future release). Please refer to the documentation for more details.
[Warning] [MY-013360] [Server] Plugin mysql_native_password reported: ''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
[Warning] [MY-013869] [InnoDB] Ignored deprecated configuration parameter innodb_log_file_size. Used innodb_redo_log_capacity instead.
[Warning] [MY-013870] [InnoDB] Ignored deprecated configuration parameter innodb_log_files_in_group. Used innodb_redo_log_capacity instead.
```

# グリーン環境のテスト方法

通常、以下のようなエンドポイントURLが発行されると思う

```
endpoint="test-qwe001-database-name-1.ckqbx0xpx3pn.us-east-1.rds.amazonaws.com"
```

グリーン環境は、識別可能なエンドポイントURLを発行するので、そこに繋ぎ変えるだけで良い。

```
endpoint="test-qwe001-database-name-1-green-00ivjo.ckqbx0xpx3pn.us-east-1.rds.amazonaws.com"
```

一般的な疎通確認の方法は以下の通り

```
endpoint="test-qwe001-database-name-1-green-00ivjo.ckqbx0xpx3pn.us-east-1.rds.amazonaws.com"
username="rds_admin"
mysqladmin ping -h $endpoint -P 3306 -u $username -p
-- DB内を確認したい場合は以下のようにする
mysql -h $endpoint -P 3306 -u $username -p
```

なお、グリーン環境は `read-only` オプション付きで生成されるため、参照は出来るが直接INSERTやUPDATEを行うことはできない。
グリーン環境を書き込み可能にするには、RDSインスタンスを昇格すれば良いが、公式ドキュメントはオススメしていない。

グリーン環境ではレプリケーションの競合が発生する可能性があるのと、
切り替え後に本稼働データベースに意図しないデータが発生する可能性があるため。

# グリーン環境(新環境)をブルー環境(現行環境)に引き上げるには

RDS > データベース > {DB識別子}-bg

アクション > 切り替え をクリック

スイッチオーバーの概要

タイムアウトの設定

期間: デフォルト - 5
時間の単位: デフォルト - minutes

ここまで出来たら「切替」をクリック

およそ2分ぐらいで、グリーン環境はブルー環境に切り替わる。
グリーン環境のエンドポイントは接続できなくなる。

旧ブルー環境はold1という名前でread-only状態で残る。

```
endpoint="test-qwe001-database-name-1-old1.ckqbx0xpx3pn.us-east-1.rds.amazonaws.com"
```

# 切替後の作業：旧ブルー環境の削除方法

用が済んだら、旧ブルー環境とブルー／グリーンデプロイは削除すること(インスタンス稼働中はお金がかかるため)

RDS > データベース > 旧ブルー環境(-old1)をチェック > アクション > 削除
最終スナップショットは念のため取っておく

※削除保護が有効になっている場合は無効化してから削除すること
RDS > データベース > 旧ブルー環境(-old1)をチェック > 変更 > 削除保護の有効化のチェックを外す > すぐに適用 > DBインスタンスを変更 ※再起動は発生しない

RDS > データベース > ブルー／グリーンデプロイ(-bg)をチェック > アクション > 削除
delete me を入力

作業は以上である

# 備考

なお、切替後に旧ブルー環境に切り戻すことはできない。

切り替え後の旧Blue環境は、Read onlyのクラスターとして切り離される。
旧Green環境からのレプリケーションも切断されているため、
切り戻しをする場合はスナップショットなどから復元する必要がある

切り替え後の旧Blue環境は、Read onlyのクラスターとして切り離されるため？
Green環境を再度作ることはできない