はじめに
こんにちは、ソフトウェアエンジニアの萬田です。普段はアプリケーション開発を担当していますが、2024 年3月に前任者の退職に伴ってインフラ運用も担当することになりました。本記事ではそんな自分が無事に Aurora のエンジンアップグレードを完了できた経験を共有させていただきます。
本記事では、Terraform による Amazon Aurora のインフラ管理に焦点を当て、安全にアップグレードを行うための手順について解説します。なお、MySQL エンジンのアップグレードに伴うアプリケーションコードの変更や、データベース設計上の注意点については本記事では触れません。 また、記事内のコードは作業終了後に、記事用に修正しているものになるため、実際のコードと異なる箇所があります。(そのままでは動作しない可能性もあります。)
背景
2024 年 10 月 31 日で、Amazon Aurora MySQL 互換エディション バージョン 2 (MySQL 5.7 互換) のサポートが終了しました。 AWS のドキュメントを見ると、
2024 年 10 月 31 日 — この日をもって、Aurora MySQL バージョン 2 は標準サポートが終了します。Amazon RDS では、クラスターが自動的に Amazon RDS 延長サポートに登録されます。
とあります。一見サポートは継続されるので問題なさそうに見えますが、延長サポートは有料であり時間課金でサポート料金が発生します。なのでサポート期限までにバージョンアップを行う必要がありました。
メジャーバージョンアップの概要
AWS の Aurora MySQL を Terraform で管理している環境で、MySQL 5.7 ベースのバージョンから MySQL 8.0 ベースへのアップグレードを行う場合、一度のterraform apply
では完了しません。
Aurora MySQL のアップグレードは、以下の 3 つのステップで実施する必要があります。各ステップでは異なる設定変更を行い、それぞれterraform apply
を実行します:
- メジャーバージョンアップの許可設定と即時反映オプションの有効化
- カスタムパラメータグループの解除とインスタンスタイプの変更
- エンジンバージョンの更新
各ステップの詳細
Step 1: アップグレードの準備
最初のステップでは、クラスターに対して 3 つの設定の更新を行います。
- メジャーバージョンアップを許可する設定
- 設定変更の即時反映を有効化
- クラスターパラメータグループをデフォルトへの関連付けの変更(カスタムパラメータグループを利用していた場合)
この段階ではまだ実際のエンジンバージョンのアップグレードは行われないため、データベースへの影響はありません。
カスタムパラメータグループを利用していた場合はここで、クラスターとパラメータグループの紐づけを外しておく必要があります。
カスタムパラメータグループをクラスター/インスタンスに紐づけたまま family をアップグレードしようとすると、destroy -> create
の順で実行されるのでエラーとなってしまうようです。(lifecycle でどうにかしたいですが、同名エラーに引っかかります。)仕方ないので一度デフォルトのパラメータグループに紐づけを変更することで対応しました。
module "db" { source = "terraform-aws-modules/rds-aurora/aws" version = "~> 7.2.0" name = "${var.system_name}-${local.environment_name}-aurora-mysql" engine = "aurora-mysql" engine_version = "5.7.mysql_aurora.2.11.2" # Step 1での変更点 - allow_major_version_upgrade = false + allow_major_version_upgrade = true - apply_immediately = false + apply_immediately = true - db_parameter_group_name = aws_db_parameter_group.custom.name + db_parameter_group_name = "default.aurora-mysql5.7" - db_cluster_parameter_group_name = aws_rds_cluster_parameter_group.custom.name + db_cluster_parameter_group_name = "default.aurora-mysql5.7" } resource "aws_db_parameter_group" "custom" { name = "${var.system_name}-${local.environment_name}-db-pg" family = "aurora-mysql5.7" } resource "aws_rds_cluster_parameter_group" "custom" { name = "${var.system_name}-${local.environment_name}-rds-clusterpg" family = "aurora-mysql5.7" }
allow_major_version_upgrade
と apply_immediately
は、デフォルトがfalse
なので注意が必要です。
Step 2: 設定の解除と変更
2 番目のステップでは、カスタムパラメータグループに紐づく family の更新とインスタンスタイプの更新を行います。
- カスタムパラメータグループの family の変更
- インスタンスタイプの変更(アップグレード先のバージョンでサポートされていないインスタンスタイプを利用していた場合)
この段階でも、まだデータベースエンジンのバージョンアップは行われません。 Step1 でクラスター/インスタンスとカスタムパラメータグループの紐づけを解除しているので、ここで無事にカスタムパラメータグループの family が更新できます。
インスタンスタイプの変更は必須ではないですが、アップグレード後のエンジンバージョンがサポートしていないインスタンスタイプを指定していると後続のエンジンバージョンアップグレード時にエラーになるので注意が必要です。(参考: DB インスタンスクラスでサポートされている DB エンジン)
module "db" { # 既存の設定は同じ name = "${var.system_name}-${local.environment_name}-aurora-mysql" engine = "aurora-mysql" engine_version = "5.7.mysql_aurora.2.11.2" allow_major_version_upgrade = true apply_immediately = true db_parameter_group_name = "default.aurora-mysql5.7" db_cluster_parameter_group_name = "default.aurora-mysql5.7" # Step 2での変更点 - instance_class = "db.t3.small" + instance_class = "db.t3.medium" } resource "aws_db_parameter_group" "custom" { name = "${var.system_name}-${local.environment_name}-db-pg" - family = "aurora-mysql5.7" + family = "aurora-mysql8.0" } resource "aws_rds_cluster_parameter_group" "custom" { name = "${var.system_name}-${local.environment_name}-rds-clusterpg" - family = "aurora-mysql5.7" + family = "aurora-mysql8.0" }
Step 3: エンジンバージョンのアップグレード
最後のステップで、実際のエンジンバージョンの更新を行います。この段階で最も注意が必要なのは、必ずダウンタイムが発生するという点です。
バージョンアップ中は、クラスター全体が利用できなくなります。そのため、このステップは必ずメンテナンス時間中に実行する必要があります。
module "db" { # 基本設定 name = "${var.system_name}-${local.environment_name}-aurora-mysql" engine = "aurora-mysql" # Step 3での変更点 - engine_version = "5.7.mysql_aurora.2.11.2" + engine_version = "8.0.mysql_aurora.3.04.0" # MySQL 8.0へアップグレード allow_major_version_upgrade = true apply_immediately = true - db_parameter_group_name = "default.aurora-mysql5.7" + db_parameter_group_name = resource.aws_db_parameter_group.custom.name - db_cluster_parameter_group_name = "default.aurora-mysql5.7" + db_cluster_parameter_group_name = resource.aws_rds_cluster_parameter_group.custom.name } resource "aws_db_parameter_group" "custom" { name = "${var.system_name}-${local.environment_name}-db-pg" family = "aurora-mysql8.0" } resource "aws_rds_cluster_parameter_group" "custom" { name = "${var.system_name}-${local.environment_name}-rds-clusterpg" family = "aurora-mysql8.0" }
そこそこ時間がかかりますが、コンソール画面で RDS のステータスを確認して、利用可能となっていれば作業終了です。
まとめ
Aurora MySQL のアップグレードは、慎重な計画と準備が必要な作業です。 Terraform で管理している環境でカスタムパラメータグループを利用している場合、 今回のように 3Step に分割して apply することで無事にエンジンバージョンのアップグレードが実施できます。 次回のエンジンバージョンのアップグレード時にも同様の作業は発生する(と思われる)ので、覚えておきたいですね。