🚫

Aurora MySQL5.7からMySQL8.0への切り替えエラーメモ

2024/05/06に公開

概要

Aurora MySQL5.7で稼働してるものをAurora MySQL8.0に切り替えるために
新しくMySQL8.0でRDSを構築し、データを移行することにした
切り替えでうまくいかなかった部分があったので全体の流れをメモとして残す

おおまかな手順

  1. 既存のAuroraのスナップショットを取得
  2. MySQL8.0用のクラスタパラメータ、インスタンスパラメータを作成
  3. 取得したスナップショットからAurora MySQL8.0を作成

パラメータ確認

まず既存のパラメータからデフォルト値が変わってるものを確認
→コンソールからMySQL8.0のパラメータグループを作成して差分確認
→変更が必要な設定値があるか確認

スナップショットの取得

resource "aws_db_cluster_snapshot" "snapshot" {
  db_cluster_identifier          = {スナップショット取得元のrdsクラスタ識別子}
  db_cluster_snapshot_identifier = "snapshot_YYYYMMDD"

  lifecycle {
    ignore_changes = [db_cluster_snapshot_identifier]
  }
}

パラメータグループの作成

MySQL5.7で設定していた値と、新たに設定が必要なものを記述

/* クラスタパラメータグループ */
resource "aws_rds_cluster_parameter_group" "default" {
  name        = "rds-cluster-pg"
  family      = "aurora-mysql8.0"

  parameter {
    name  = "character_set_server"
    value = "utf8"
  }

  parameter {
    name  = "character_set_client"
    value = "utf8"
  }
  ...
}

/* インスタンスパラメータグループ */
resource "aws_db_parameter_group" "default" {
  name   = "rds-pg"
  family = "aurora-mysql8.0"

  parameter {
    name  = "character_set_server"
    value = "utf8"
  }

  parameter {
    name  = "character_set_client"
    value = "utf8"
  }
  ...
}

クラスタの作成

resource "aws_rds_cluster" "default" {
  cluster_identifier              = "aurora-cluster"
  engine                          = "aurora-mysql"
  engine_version                  = "8.0.mysql_aurora.3.05.2"
  availability_zones              = ["ap-northeast-1a", "ap-northeast-1b", "ap-northeast-1c"]
  db_cluster_parameter_group_name = aws_rds_cluster_parameter_group.default.name
  snapshot_identifier             = aws_db_cluster_snapshot.snapshot.db_cluster_snapshot_identifier
  ...

  depends_on = [aws_db_cluster_snapshot.snapshot]
}

インスタンスの作成

resource "aws_rds_cluster_instance" "instance01" {
  cluster_identifier      = aws_rds_cluster.default.cluster_identifier
  identifier              = "aurora-cluster-instance-01"
  engine                  = "aurora-mysql"
  engine_version          = "8.0.mysql_aurora.3.05.2"
  availability_zone       = "ap-northeast-1a"
  db_parameter_group_name = aws_db_parameter_group.default.name
  ...

  depends_on = [aws_rds_cluster.default]
}

resource "aws_rds_cluster_instance" "instance02" {
  cluster_identifier      = aws_rds_cluster.default.cluster_identifier
  identifier              = "aurora-cluster-instance-02"
  engine                  = "aurora-mysql"
  engine_version          = "8.0.mysql_aurora.3.05.2"
  availability_zone       = "ap-northeast-1b"
  db_parameter_group_name = aws_db_parameter_group.default.name
  ...

  depends_on = [
    aws_rds_cluster.default,
    aws_rds_cluster_instance.instance01
  ]
}

apply失敗した

planでは想定通りだったが、applyすると2つ目のインスタンス作成時にエラーになった
現象としては1つ目のインスタンスのengineがMySQL5.7になっており、それに引きずられてクラスタのengineもMySQL5.7になりインスタンス作成が失敗していた

原因としては既存のトリガーに予約後が含まれており、それによってスナップショットからの復元時にMySQL8.0へのバージョンアップに失敗していた
※予約後はバッククオートでくくっていたがそれでもダメだった

対応方法としては一旦トリガーを削除→上記Terraformをapply→トリガー再作成となった

Discussion