Amazon RDSをAuroraにできるだけ簡単に移行&メジャーアップグレードしてみた ~RDS MySQL 5.7からAurora MySQL 8.0への移行を例に~

2024.01.29

Amazon RDS のMySQL 5.7やPostgreSQl 11が2024年2月末に標準サポートを終了するのに伴い、RDS延長サポート費用を支払って継続利用するか、メジャーアップグレードする選択が迫られています。

今回の標準サポートを終了を期に、メジャーアップグレードだけでなくRDSからAuroraへの移行、具体的には、RDS MySQL 5.7から Aurora MySQL 8.0への移行を支援する機会がありましたので、共有します。

PostgreSQLでも同様のことが成り立つかと思います。

なお、本記事では、RDSとAuroraの対比がわかりやすいように "Amazon RDS for MySQL 5.7""RDS MySQL 5.7""Amazon Aurora MySQL 3(MySQL 8.0互換)""Aurora MySQL 8.0" というように表記しています。

要件

  • RDS MySQL 5.7からAurora MySQL 8.0に移行
  • 数時間のまとまったダウンタイムは許容できる
  • DBAのようなデータベーススペシャリストに依存しない移行方式

つまるところ、まとまった計画メンテナンス時間を確保し、リスクを減らした理解し易い単純明快な移行計画が求められます。

そのため、AWSのマネージド機能を積極活用しています。

おすすめ移行方法

RDS MySQL 5.7から Aurora MySQL 8.0へ移行する場合

  • RDSからAuroraへの実行基盤の移行
  • MySQL 5.7 からMySQL 8.0へのメジャーアップグレード

の2つの処理が伴います。

この前提の上で、おすすめの移行方法は次の2つです

  1. RDS MySQL 5.7のスナップショットを取得し、Aurora MySQL 8.0をリストア
  2. RDS MySQL 5.7にAurora MySQL MySQL 5.7のレプリカを追加し、プライマリ昇格後にAurora MySQL 8.0へインプレース・アップグレード

どちらの移行手順も簡単&シンプルです。

まずはスナップショット方式を評価してみるのが良いかと思います。

順にかいつまんで説明します。

スナップショット方式

1つ目のスナップショット方式は、メンテナンス中に全ての移行作業を行います。具体的には、RDS MySQL 5.7のスナップショットを取得し(RDS::CreateDBSnapshot)、このスナップショットからAurora MySQL MySQL 8.0のクラスターをリストアします(RDS::RestoreDBClusterFromSnapshot)。

内部的にはRDSのスナップショットから対応するバージョンのAuroraクラスターを作成し、インプレースでメジャーアップグレードしています。

データベースのエンドポイントが変わるため、アプリケーションの設定(あるいはDNSレコード)を書き換えます。

スナップショット名と新クラスター名をきめてしまえば、事前に手順が確定します。

移行元のマイナーバージョンによって移行先バージョンが限定されます。例えば、5.7系の最新でない5.7.38のスナップショットからMySQL 8.0系のAuroraをリストアしようとすると、以下のエラーが発生します。

$ aws rds restore-db-cluster-from-snapshot \
  --snapshot-identifier arn:aws:rds:ap-northeast-1:01234:snapshot:your-old-snapshot \
  --engine-version 8.0.mysql_aurora.3.04.1 \
  --db-cluster-identifier your-new-aurora-cluster \
  --engine aurora-mysql

An error occurred (InvalidParameterCombination) when calling the RestoreDBClusterFromSnapshot operation: 
  Cannot upgrade from mysql 5.7.38 to aurora-mysql 8.0.mysql_aurora.3.04.1.
  Specify a current active database version, the latest active minor version for mysql 5.7 is 5.7.44.

メンテナンス前にマイナーアップグレードを済ませておくと良いでしょう。

Auroraレプリカ追加方式

2つ目は移行先Auroraクラスターを事前にプロビジョニングしておき、メンテナンス中の作業はメジャーアップグレードだけです。 一方で、事前にクラスターをプロビジョニングするため、移行に伴うAWS費が少しかさみます。

RDS MySQL 5.7からRDS MySQL 8.0にアップグレードしたあとでAurora化しても最終的には同じ状態になりますが、全ての手順をメンテナンス中に実施することになります。本手順のように、Aurora化を事前に済ませたほうが、メンテナンス時間を短縮できるでしょう。

RDS MySQLに追加可能なAuroraレプリカのバージョンはAPI等で取得できないため、試行錯誤してください。

レプリケーションのおかげで切り戻し先となる既存のRDSインスタンスは手つかずのままです。十分なメンテナンス時間も確保しているため、Aurora MySQL 5.7から8.0へのアップグレードはクラスターそのものに変更を加えるインプレース方式を採用しています。

選択肢を検討

移行ではRDSからAuroraへの移行、及び、メジャーアップグレードの他の選択肢も検討します。

RDSからAuroraへの実行基盤の移行

RDSからAuroraへ実行基盤を移行する場合、以下の様なアプローチがあります

  • RDSスナップショットからAuroraクラスターを作成
  • RDSにAuroraレプリカを追加し、切り替え時にAuroraクラスターとして昇格
方法 手順 ダウンタイム エンドポイント 切り戻し先
スナップショット シンプル 長い 変わる 残る
レプリカの&昇格 シンプル 短い 変わる 残る

スナップショット

切り替えのタイミングでスナップショットを取得し、新クラスタを作成します。

スナップショットはRDSからAuroraへの移行だけでなく、メジャーアップグレードにも使えるため、その両方を同時に実現するのが良いでしょう。

新クラスタを作成するため、データベースのエンドポイントが変わります。

Auroraレプリカの昇格

RDSにAuroraレプリカを追加し、切り替え時にAuroraクラスターとして昇格します。

Auroraクラスターが新環境となるため、データベースのエンドポイントが変わります。

残念ながら、RDS MySQL 5.7からAurora MySQL 8.0のようなメジャーバージョンをまたいだAuroraレプリケーションの追加には対応していません。

そのため、Aurora化後にメジャーアップグレード、あるいは、メジャーアップグレード後にAurora化のどちらかが必要です。

エンジンのメジャーアップグレード

DBエンジンをメジャーアップグレードする場合、以下の様なアプローチがあります。

  • スナップショットからインスタンスを作り直し
  • Blue/Greenデプロイメント
  • インプレースアップグレード
方法 手順 ダウンタイム エンドポイント 切り戻し先
スナップショット シンプル 長い 変わる 残る
Blue/Green 普通 瞬断 同じ 残る
インプレース シンプル 長い 同じ スナップショットからリストア

スナップショット

切り替えのタイミングでスナップショットを取得し、新クラスタを作成します。

スナップショットはRDSからAuroraへの移行だけでなく、メジャーアップグレードにも使えるため、その両方を同時に実現するのが良いでしょう。

新クラスタを作成するため、データベースのエンドポイントが変わります。

Blue/Greenデプロイメント

RDS間、及び、Aurora間でメジャーアップグレードする場合、Blue/Greenデプロイメントが使えます。

ダウンタイムはスイッチオーバー時の一瞬ですし、アプリケーションの接続先が同じになるようなエンドポイントの調整や、切り替え時のデータロス対策等がフルマネージドで行われ、切り戻し先も残ります。

RDSあるいはAuroraに閉じて短いダウンタイムでメジャーアップグレードするのであれば最有力です。

RDSからAuroraへのBlue/GreenやAuroraレプリカをソースとしたBlue/Greenには対応していないため、今回は採用を見送りました。

※RDS MySQL 5.7からAurora MySQL 5.7のレプリカを追加した場合、このレプリカをソースとしたAurora MySQL 8.0へのBlue/Greenはできない

インプレースアップグレード

インプレースアップグレードでは、クラスターを直接メジャーアップグレードします。

小難しそうな名前ですが、操作としてはコンソールの編集画面でバージョンを変更するだけの一番直感的なバージョンアップ方法です。 当然ながら、エンドポイントも維持されます。

既存クラスターを直接変更するため、切り戻したい場合は、インプレースアップグレード開始時に取得されるスナップショットからリストアします。

別途、RDSからAuroraへの移行が必要です。

RDSからAuroraへのスナップショット移行時の注意

AWSにはRDSのスナップショットからAuroraクラスタを作成する機能があります。

マネジメントコンソールでは、この移行アクションがグレーアウトされていたり、移行先バージョンの候補が期待通りにあらわれないことがあります。

そのような場合は、AWS CLIなどAPI経由で操作しましょう。

参考