技術系TIPS
PR

AWSのRDSをブルーグリーンデプロイ(blue-green)で5.7から8.0にアップグレード

saratogax
記事内に商品プロモーションを含む場合があります

MySQL5.7 で運用していた AWS の RDS。

サポートが切れ、2024 年 3 月からは強制的にアップグレードはされないものの、有償サポート期間に突入ということで、それだけは避けたいところ。

ということで、MySQL8.0 にアップグレードします。

少し前に、Aurora で MySQL5.7 から MySQL8.0 へブルーグリーンデプロイを行ったばかりだったので、その経験を活かしてブルーグリーンデプロイでやってみます。

ブルーグリーンデプロイ

AWS で 2022 年頃に登場した新しい機能。

今回のケースで言うと、MySQL8.0 の RDS を新しく作成して、MySQL5.7 の RDS からレプリケーションを行います。
(この時点で RDS は 2 台になる)

RDS(MySQL5.7): ブルー(blue)
RDS(MySQL8.0): グリーン(green)

そして切り替え作業を行うとブルーとグリーンが入れ替わり、RDS のエンドポイントもそのまま新しくブルーになった RDS へ向けられます。

よって RDS に接続しているアプリは、短時間の通信断でアップグレードした MySQL が使えるというわけです。

過去に、MySQL5.6 から 5.7 へサービス無停止に近い状態で移行したことがありますが、これと同じことが簡単な操作でできるのは便利です。

Aurora クラスタ構成の場合は、少し面倒な手順が残っているものの、シンプルなパラメータグループしか使ってない RDS の場合は簡単に移行できちゃいます。

ブルーグリーンデプロイで切り替え

上記で書いた通り、ブルーグリーンで切り替えを行うと、ブルーとグリーンが入れ替わります。

RDS(MySQL5.7): 古いブルー(green)
RDS(MySQL8.0): ブルー(blue)

ブルーだった MySQL5.7 の RDS は「古いブルー」になるのですが、「green」と書いてくれた方が入れ替わった感があるのですよね。

って、以前は「古いブルー」という表現はなかった気がするのですが、どこかで AWS 側が UI 変えたのかなって思ってます。

ブルーグリーンデプロイ - RDS - MySQL - Aurora - AWS

ブルーグリーンデプロイの削除

新しくブルーとなった MySQL8.0 へ接続も切り替わっているので、アプリの動作に問題がなかったら、ブルーグリーンを削除します。

どちらにしても、このブルーグリーンは 2024 年 2 月現在、ロールバックの機能を備えていないので、古いブルーを戻したりはできないのですよね。

なので、商用のサービスでは事前の検証が必須です。

では、ブルーグリーンを削除します。

ブルーグリーンデプロイ - RDS - MySQL - Aurora - AWS

削除を開始すると一時的に、「Blue」と「Green」の表記が出てきますが、これはこれで逆な気も・・・。

ブルーグリーンデプロイ - RDS - MySQL - Aurora - AWS

削除が完了すれば、完全に切り離されます。

ブルーグリーンデプロイ - RDS - MySQL - Aurora - AWS

古いRDSインスタンスの削除

では、不要となった MySQL5.7 のインスタンスは削除しちゃいましょう。

このままだと料金が 2 倍発生したままになりますからね。

削除保護が有効にっている場合はインスタンスの変更からチェックを外して保存し、インスタンスの削除を実行します。

ブルーグリーンデプロイ - RDS - MySQL - Aurora - AWS

PHP5.6からutf8mb4の文字コードでMySQL8.0

ブルーグリーンデプロイから話は逸れますが、実はこの RDS に接続していたアプリの中にレガシーな PHP5.6 ベースのアプリがありました。
(しかも、Codeigniter2 のフレームワーク)

そのアプリからの DB 接続では以下のエラーが発生。

Unable to connect to the database

Severity: Warning –> mysqli_connect(): Server sent charset (255) unknown to the client.

Severity: Warning –> mysqli_connect(): (HY000/2054): Server sent charset unknown to the client.

どうやら文字コードで怒られていますね。

これまで、RDS もアプリも「utf8mb4」で利用しており、MySQL8.0 の RDS でも変わりないのですけどね。

mysqli などのドライバの問題なのでしょうか。

って、PHP5.6 なんてとっくの昔にサポート外ですからね。

MySQLサーバの文字コード設定

RDS のパラメータグループではデフォルトの「utf8mb4」で、当然 MySQL の文字コード設定を見ても同じ。

character_set_system だけ「utf8mb3」なのは気になります。

って、「utf8」の表示って「utf8mb3」になったのでしょうか。

バイト数の表現が明確になっていいかもしれませんが、いきなりだな・・・。

 mysql> show variables like 'character_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb4 |
| character_set_system     | utf8mb3 |
+--------------------------+---------+

設定を調整してみましたが解決しなかったので、一旦は絵文字などの使用を諦めて、アプリ側も「utf8mb3」で統一することにしました。

パラメータグループで「utf8」に統一した割に、変更が入ったのは「character_set_server」のところのみか・・・。

 mysql> show variables like 'character_set\_%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| character_set_client     | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database   | utf8mb4 |
| character_set_filesystem | binary  |
| character_set_results    | utf8mb4 |
| character_set_server     | utf8mb3 |
| character_set_system     | utf8mb3 |
+--------------------------+---------+

パラメータグループはこんな感じ。

ブルーグリーンデプロイ - RDS - MySQL - Aurora - AWS

utf8mb3は非推奨(deprecated)

MySQL の公式ドキュメントを見ると、以下の記載があります。

将来的には utf8 が utf8mb4 のエイリアスになるのか。

ってことで、そろそろ PHP5.6 の古いアプリも誤魔化しきれなくなってきますね。

utf8mb3 文字セットは非推奨であり、将来の MySQL リリースで削除される予定です。 かわりに utf8mb4 を使用してください。 utf8 は現在 utf8mb3 のエイリアスですが、ある時点では utf8 が utf8mb4 への参照になることが予想されます。 utf8 の意味があいまいにならないように、utf8 ではなく文字セット参照に utf8mb4 を明示的に指定することを検討してください。

utf8mb3 文字セット (3 バイトの UTF-8 Unicode エンコーディング)
ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました