📑

Aurora MySQL v2をv3に切り替え(blue/green deploy) Error発生

2024/10/14に公開

過去ログ

1回目

https://zenn.dev/shigeru_oda/articles/57d24dc357f2a0

2回目

https://zenn.dev/shigeru_oda/articles/9ed9194a6384dd

やりたいこと

  • SnapShoot取得
  • Aurora MySQL v2からv3に更新(blue/green deploy)
    • Errorでここで止まります
  • Replication中にDMLの挙動確認

読んでおく資料と要約

  • Upgrading the major version of an Amazon Aurora MySQL DB cluster
    • Amazon Aurora MySQLのメジャーバージョンアップグレードに関するガイドライン
    • 手動でのアップグレード:自動アップグレードはサポートされていないため、手動でのアップグレードが必要
    • 互換性の確認:アップグレード対象のバージョン間の互換性を確認することが推奨
    • ダウンタイムの考慮:アップグレードにはインスタンスの再起動や短期間のダウンタイムが発生する可能性があり
    • アップグレード後の設定:アップグレード後には、設定やパラメータの調整が必要
  • Comparing Aurora MySQL version 2 and Aurora MySQL version 3
    • Amazon Aurora MySQL v2(MySQL 5.7ベース)とv3(MySQL 8.0ベース)の違いを比較
    • ベースとなるバージョン:v2はMySQL 5.7、v3はMySQL 8.0を基にしている
    • 主な変更点:MySQL 8.0の新機能として、JSONの処理強化、セキュリティ向上、暗号化のデフォルト設定が異なるなどの違いがあり
    • 互換性の考慮:v3では、MySQL 5.7と互換性のない変更があるため、アップグレード前に検証することが推奨
  • Amazon Aurora MySQL version 2 (with MySQL 5.7 compatibility) to version 3 (with MySQL 8.0 compatibility) upgrade checklist, Part 1
    • 事前の準備:互換性のあるエンジンバージョンを確認し、推奨されるテストを行うことが重要
    • アプリケーションの影響:MySQL 8.0に移行する際、アプリケーションが新しい機能や仕様に対応できるかを確認する必要
    • 互換性チェック:移行に伴う互換性問題を事前に検出するためのSQLモードやデータ型の変更を検証
  • Amazon Aurora MySQL version 2 (with MySQL 5.7 compatibility) to version 3 (with MySQL 8.0 compatibility) upgrade checklist, Part 2
    • アップグレードプロセスの手順:アップグレードに伴うインスタンスの切り替えやデータの検証方法
    • ダウンタイムの最小化:Blue/Greenデプロイメントのような技術を使って、アップグレード時のダウンタイムを最小限に抑える方法
    • 運用環境での移行:運用環境への影響を最小限にするためのベストプラクティス
  • Overview of Amazon RDS Blue/Green Deployments for Aurora
    • Blue/Greenデプロイメントは、新しいバージョンのアプリケーションをスムーズにリリースするためのデプロイ手法
    • 仕組み:Blue(現在の環境)とGreen(新しい環境)を並行して維持し、問題がなければGreenに切り替える方法
    • メリット:ダウンタイムをほぼゼロに抑え、リスクを低減します。また、万が一問題が発生した場合、すぐに元のBlue環境に戻すことができる
    • 適用例:Amazon AuroraやRDSにおけるデータベースのアップグレードや、アプリケーションの新バージョン導入に有効

手順

Snapshotの作成

Snapshotの作成

aws rds create-db-cluster-snapshot \
    --db-cluster-snapshot-identifier aurora-mysql-blue-green-cluster \
    --db-cluster-identifier aurora-mysql-blue-green-cluster

確認
Statusがavailableになるまで待機

aws rds describe-db-cluster-snapshots \
    --db-cluster-identifier aurora-mysql-blue-green-cluster \
    --query "DBClusterSnapshots[*].Status" \
    --output text

MySQL8.0のパラメタグループ作成

設定内容は

git clone https://github.com/shigeru-oda/aurora-mysql-blue-green.git
cd aurora-mysql-blue-green/terraform/v3
terraform init
terraform apply

再起動

aws rds reboot-db-instance \
    --db-instance-identifier aurora-mysql-read
aws rds reboot-db-instance \
    --db-instance-identifier aurora-mysql-write

起動まで待ち。

Blue/Greenの実行

Blue/Greenデプロイメントの作成
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/blue-green-deployments-creating.html

aws rds create-blue-green-deployment \
    --blue-green-deployment-name blue-green-deployment \
    --source arn:aws:rds:ap-northeast-1:xxxxxxxxxxxx:cluster:aurora-mysql-blue-green-cluster \
    --target-engine-version 8.0.mysql_aurora.3.05.2 \
    --target-db-parameter-group-name aurora-mysql-db-param-group-80 \
    --target-db-cluster-parameter-group-name aurora-mysql-cluster-param-group-80 \
    --no-upgrade-target-storage-config

Blue/Greenデプロイメントの表示
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/blue-green-deployments-viewing.html

aws rds describe-blue-green-deployments \
    --filters Name=blue-green-deployment-name,Values=blue-green-deployment

あ、FAILEDした

ログ確認

ログファイル確認1

aws rds describe-events \
    --source-identifier aurora-mysql-blue-green-cluster-green-xdzhnl \
    --source-type db-cluster

こんなメッセージが

ログファイル確認2

aws rds download-db-log-file-portion \
    --db-instance-identifier aurora-mysql-write-green-8flpxi \
    --log-file-name upgrade-prechecks.log \
     --output text
{
    "level": "Error",
    "dbObject": "cube.insert_data_empty",
    "description": "at line 4,16: unexpected token 'empty'"
}
{
    "level": "Warning",
    "dbObject": "cube",
    "description": "Schema name"
},
{
    "level": "Warning",
    "dbObject": "cube.empty",
    "description": "Table name"
},
{
    "level": "Warning",
    "dbObject": "cube.empty.lag",
    "description": "Column name"
},
{
    "level": "Warning",
    "dbObject": "cube.empty.lead",
    "description": "Column name"
},
{
    "level": "Warning",
    "dbObject": "cube.empty.of",
    "description": "Column name"
},
{
    "level": "Warning",
    "dbObject": "cube.empty.rank",
    "description": "Column name"
}
{
    "level": "Warning",
    "dbObject": "global.sql_mode",
    "description": "does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates"
},
{
    "level": "Warning",
    "dbObject": "session.sql_mode",
    "description": " of 8 session(s) does not contain either NO_ZERO_DATE or NO_ZERO_IN_DATE which allows insertion of zero dates"
}
  • やっぱり予約語を含めるとダメっぽい
  • 日付にゼロを許容する設定はダメっぽい
  • ログ全体はこちら
  • 試しで更新してログ確認するのは良いかもね

blue/green deployを終了する

ID=$(aws rds describe-blue-green-deployments \
    --query "BlueGreenDeployments[*].BlueGreenDeploymentIdentifier" \
    --output text)

aws rds delete-blue-green-deployment \
    --blue-green-deployment-identifier $ID

blue/grrenは終わるけど、cluster等は残るんだなぁ
手で消します。。。

Discussion