はじめに
Amazon Aurora MySQL v2系の標準サポートが2024年10月31日に終了しました。
Aurora MySQLをv2系からv3系へアップグレードについて、Amazon Aurora Blue/Green Deployments を用いてのアップグレードを試しました。
Amazon Aurora Blue/Green Deployments
Amazon Aurora Blue/Green Deployments は、稼働中の環境(Blue環境)から、論理レプリケーションによってデータを複製された新しい環境(Green環境)を作成できます。
稼働中の環境(Blue環境)には影響を与えずに、複製された Green 環境でデータベースのバージョンアップやパラメータの変更を行ない、テスト等をすることが可能です。Green環境を新しい稼働環境(新Blue環境)として昇格させることで、少ないダウンタイムでの切り替えが可能です。
バージョンアップ手順
CDK で作成した Aurora MySQL v2 を手動で Blue/Green Deployments で v3 へアップグレードし、その後 CDK コードを実態に合わせて修正してデプロイすることで、整合性を保てるかを試してみます。
事前準備
以下のような内容で、Aurora MySQL v2.11.2 のクラスターと、v2 用のパラメーターグループ、v3用のパラメーターグループを作成しています。 それ以外の細かいリソースについては省略しています。
// Aurora MySQL v2 用のクラスターパラメータグループ const auroraClusterParameterGroupV2 = new rds.ParameterGroup(this, ' ClusterParameterGroupV2', { engine: rds.DatabaseClusterEngine.auroraMysql({ version: rds.AuroraMysqlEngineVersion.VER_2_11_1 }), parameters: { 'binlog_format': 'MIXED' } }) // Aurora MySQL v3 用のクラスターパラメータグループ const auroraClusterParameterGroupV3 = new rds.CfnDBClusterParameterGroup(this, 'AuroraClusterParameterGroupV3', { family: 'aurora-mysql8.0', description: 'Custom parameter group for Aurora MySQL 3.x', parameters: { 'binlog_format': 'MIXED', }, }); // Aurora MySQL クラスターの作成 this.auroraCluster = new rds.DatabaseCluster(this, 'AuroraCluster', { engine: rds.DatabaseClusterEngine.auroraMysql({ version: rds.AuroraMysqlEngineVersion.VER_2_11_2, // version: rds.AuroraMysqlEngineVersion.of('8.0.mysql_aurora.3.08.0', '3.08.0'), }), instanceProps: { vpc: this.vpc, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, }, instanceType: ec2.InstanceType.of( ec2.InstanceClass.T3, ec2.InstanceSize.MEDIUM ), securityGroups: [dbSecurityGroup], }, instances: 1, //parameterGroup: rds.ParameterGroup.fromParameterGroupName( // this, // 'ImportedParameterGroup', // auroraClusterParameterGroupV3.ref // ), parameterGroup: auroraClusterParameterGroupV2, credentials: rds.Credentials.fromGeneratedSecret('admin'), port: 3306, backup: { retention: cdk.Duration.days(7), }, deletionProtection: true, });
構成としては以下のようになっています。

Blue / Green Deployment の作成
CLI でBlue/Greenデプロイメントを作成します。
% aws rds create-blue-green-deployment \
--blue-green-deployment-name aurora-blue-green-deployment \
--source arn:aws:rds:ap-northeast-1:123456789012:cluster:test-db-cluster \
--target-engine-version 8.0 \
--target-db-cluster-parameter-group-name test-aurora-mysql-v3-db-cluster-parametergroupv
以下のような出力があります。
{ "BlueGreenDeployment": { "BlueGreenDeploymentIdentifier": "bgd-vbn9jpyhwo1ugebx", "BlueGreenDeploymentName": "aurora-blue-green-deployment", "Source": "arn:aws:rds:ap-northeast-1:123456789012:cluster:cdkworksstack-auroracluster23d869c0-jenbv0gi9nil", "SwitchoverDetails": [ { "SourceMember": "arn:aws:rds:ap-northeast-1:123456789012:cluster:cdkworksstack-auroracluster23d869c0-jenbv0gi9nil", "Status": "PROVISIONING" }, { "SourceMember": "arn:aws:rds:ap-northeast-1:123456789012:db:cdkworksstack-auroraclusterinstance19e8278eb-umsrwpbubfve", "Status": "PROVISIONING" } ], "Tasks": [ { "Name": "CREATING_READ_REPLICA_OF_SOURCE", "Status": "PENDING" }, { "Name": "DB_ENGINE_VERSION_UPGRADE", "Status": "PENDING" }, { "Name": "CREATE_DB_INSTANCES_FOR_CLUSTER", "Status": "PENDING" } ], "Status": "PROVISIONING", "CreateTime": "2024-12-18T09:31:04.097000+00:00", "TagList": [] } }
以下のような構成になります。

切り替え
ステータスを確認します。
% aws rds describe-blue-green-deployments --filters Name=blue-green-deployment-name,Values=aurora-blue-green-deployment
SwichOverDetails が全て AVAILABLE になっていて、 Tasksも全て COMPLETED になっていれば切り替え可能な状態だと思います。
{ "BlueGreenDeployments": [ { "BlueGreenDeploymentIdentifier": "bgd-vbn9jpyhwo1ugebx", "BlueGreenDeploymentName": "aurora-blue-green-deployment", "Source": "arn:aws:rds:ap-northeast-1:123456789012:cluster:cdkworksstack-auroracluster23d869c0-jenbv0gi9nil", "Target": "arn:aws:rds:ap-northeast-1:123456789012:cluster:cdkworksstack-auroracluster23d869c0-jenbv0gi9nil-green-ts4lpe", "SwitchoverDetails": [ { "SourceMember": "arn:aws:rds:ap-northeast-1:123456789012:cluster:cdkworksstack-auroracluster23d869c0-jenbv0gi9nil", "TargetMember": "arn:aws:rds:ap-northeast-1:123456789012:cluster:cdkworksstack-auroracluster23d869c0-jenbv0gi9nil-green-ts4lpe", "Status": "AVAILABLE" }, { "SourceMember": "arn:aws:rds:ap-northeast-1:123456789012:db:cdkworksstack-auroraclusterinstance19e8278eb-umsrwpbubfve", "TargetMember": "arn:aws:rds:ap-northeast-1:123456789012:db:cdkworksstack-auroraclusterinstance19e8278eb-umsrw-green-mgi89m", "Status": "AVAILABLE" } ], "Tasks": [ { "Name": "CREATING_READ_REPLICA_OF_SOURCE", "Status": "COMPLETED" }, { "Name": "DB_ENGINE_VERSION_UPGRADE", "Status": "COMPLETED" }, { "Name": "CREATE_DB_INSTANCES_FOR_CLUSTER", "Status": "COMPLETED" } ], "Status": "AVAILABLE", "CreateTime": "2024-12-18T09:31:04.097000+00:00", "TagList": [] } ] }
switchoverを実行します。
% aws rds switchover-blue-green-deployment \
--blue-green-deployment-identifier bgd-vbn9jpyhwo1ugebx \
--switchover-timeout 600
以下のような出力があります。
{ "BlueGreenDeployment": { "BlueGreenDeploymentIdentifier": "bgd-vbn9jpyhwo1ugebx", "BlueGreenDeploymentName": "aurora-blue-green-deployment", "Source": "arn:aws:rds:ap-northeast-1:123456789012:cluster:cdkworksstack-auroracluster23d869c0-jenbv0gi9nil", "Target": "arn:aws:rds:ap-northeast-1:123456789012:cluster:cdkworksstack-auroracluster23d869c0-jenbv0gi9nil-green-ts4lpe", "SwitchoverDetails": [ { "SourceMember": "arn:aws:rds:ap-northeast-1:123456789012:cluster:cdkworksstack-auroracluster23d869c0-jenbv0gi9nil", "TargetMember": "arn:aws:rds:ap-northeast-1:123456789012:cluster:cdkworksstack-auroracluster23d869c0-jenbv0gi9nil-green-ts4lpe", "Status": "AVAILABLE" }, { "SourceMember": "arn:aws:rds:ap-northeast-1:123456789012:db:cdkworksstack-auroraclusterinstance19e8278eb-umsrwpbubfve", "TargetMember": "arn:aws:rds:ap-northeast-1:123456789012:db:cdkworksstack-auroraclusterinstance19e8278eb-umsrw-green-mgi89m", "Status": "AVAILABLE" } ], "Tasks": [ { "Name": "CREATING_READ_REPLICA_OF_SOURCE", "Status": "COMPLETED" }, { "Name": "DB_ENGINE_VERSION_UPGRADE", "Status": "COMPLETED" }, { "Name": "CREATE_DB_INSTANCES_FOR_CLUSTER", "Status": "COMPLETED" } ], "Status": "SWITCHOVER_IN_PROGRESS", "CreateTime": "2024-12-18T09:31:04.097000+00:00", "TagList": [] } }
以下のような構成になります。

CDK と実態の状態の一致
CDK のコードを修正します。
Aurora DB クラスターの engine と parameterGroup の部分を v3 のパラメーターの指定に変更します。
// Aurora MySQL v2 用のクラスターパラメータグループ const auroraClusterParameterGroupV2 = new rds.ParameterGroup(this, ' ClusterParameterGroupV2', { engine: rds.DatabaseClusterEngine.auroraMysql({ version: rds.AuroraMysqlEngineVersion.VER_2_11_1 }), parameters: { 'binlog_format': 'MIXED' } }) // Aurora MySQL v3 用のクラスターパラメータグループ const auroraClusterParameterGroupV3 = new rds.CfnDBClusterParameterGroup(this, 'AuroraClusterParameterGroupV3', { family: 'aurora-mysql8.0', description: 'Custom parameter group for Aurora MySQL 3.x', parameters: { 'binlog_format': 'MIXED', }, }); // Aurora MySQL クラスターの作成 this.auroraCluster = new rds.DatabaseCluster(this, 'AuroraCluster', { engine: rds.DatabaseClusterEngine.auroraMysql({ // 以下をコメントアウトする //version: rds.AuroraMysqlEngineVersion.VER_2_11_2, // 以下をコメントインする version: rds.AuroraMysqlEngineVersion.of('8.0.mysql_aurora.3.08.0', '3.08.0'), }), instanceProps: { vpc: this.vpc, vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, }, instanceType: ec2.InstanceType.of( ec2.InstanceClass.T3, ec2.InstanceSize.MEDIUM ), securityGroups: [dbSecurityGroup], }, instances: 1, // 以下をコメントインする parameterGroup: rds.ParameterGroup.fromParameterGroupName( this, 'ImportedParameterGroup', auroraClusterParameterGroupV3.ref ), // 以下をコメントアウトする // parameterGroup: auroraClusterParameterGroupV2, credentials: rds.Credentials.fromGeneratedSecret('admin'), port: 3306, backup: { retention: cdk.Duration.days(7), }, deletionProtection: true, });
以下を見るとUpdate requiresがReplacementではないので大丈夫なはずです。
- AWS::RDS::DBCluster - AWS CloudFormation
- AWS::RDS::DBInstance - AWS CloudFormation
- AWS::RDS::DBCluster - AWS CloudFormation
デプロイを試します。
% npx cdk deploy
なぜか v2 のパラメーターグループを削除しようとし、古いBlueクラスターに紐づいた状態であるため、その削除に失敗しますが、クラスター自体は特に何事もなく、実態と合わせられたようです。
[WARNING] aws-cdk-lib.aws_rds.DatabaseClusterProps#instanceProps is deprecated.
- use writer and readers instead
This API will be removed in the next major release.
[WARNING] aws-cdk-lib.aws_rds.DatabaseClusterProps#instances is deprecated.
- use writer and readers instead
This API will be removed in the next major release.
✨ Synthesis time: 11.5s
CdkWorksStack: start: Building 3f9d1dae1b2aaa9b0090279de4fb49b6862727a1f7aa169ce4966b6f4ecdf750:123456789012-ap-northeast-1
CdkWorksStack: success: Built 3f9d1dae1b2aaa9b0090279de4fb49b6862727a1f7aa169ce4966b6f4ecdf750:123456789012-ap-northeast-1
CdkWorksStack: start: Publishing 3f9d1dae1b2aaa9b0090279de4fb49b6862727a1f7aa169ce4966b6f4ecdf750:123456789012-ap-northeast-1
CdkWorksStack: success: Published 3f9d1dae1b2aaa9b0090279de4fb49b6862727a1f7aa169ce4966b6f4ecdf750:123456789012-ap-northeast-1
CdkWorksStack: deploying... [1/1]
CdkWorksStack: creating CloudFormation changeset...
CdkWorksStack | 0/4 | 1:55:17 | UPDATE_IN_PROGRESS | AWS::CloudFormation::Stack | CdkWorksStack User Initiated
CdkWorksStack | 0/4 | 1:55:23 | UPDATE_IN_PROGRESS | AWS::RDS::DBCluster | AuroraCluster (AuroraCluster23D869C0)
CdkWorksStack | 1/4 | 1:55:26 | UPDATE_COMPLETE | AWS::RDS::DBCluster | AuroraCluster (AuroraCluster23D869C0)
CdkWorksStack | 1/4 | 1:55:26 | UPDATE_IN_PROGRESS | AWS::RDS::DBInstance | AuroraCluster/Instance1 (AuroraClusterInstance19E8278EB)
CdkWorksStack | 2/4 | 1:55:29 | UPDATE_COMPLETE | AWS::RDS::DBInstance | AuroraCluster/Instance1 (AuroraClusterInstance19E8278EB)
CdkWorksStack | 3/4 | 1:55:31 | UPDATE_COMPLETE_CLEA | AWS::CloudFormation::Stack | CdkWorksStack
CdkWorksStack | 3/4 | 1:55:32 | DELETE_IN_PROGRESS | AWS::RDS::DBClusterParameterGroup | ClusterParameterGroupV24FABFF22
3/4 Currently in progress: CdkWorksStack, ClusterParameterGroupV24FABFF22
CdkWorksStack | 3/4 | 1:57:57 | DELETE_FAILED | AWS::RDS::DBClusterParameterGroup | ClusterParameterGroupV24FABFF22 One or more database instances are still members of this parameter group cdkworksstack-clusterparametergroupv24fabff22-sphpqndefxsz, so the group cannot be deleted (Service: Rds, Status Code: 400, Request ID: 56e462f8-3b08-42fd-af65-7d3d02890bff)
3/4 Currently in progress: CdkWorksStack
CdkWorksStack | 3/4 | 2:00:58 | DELETE_IN_PROGRESS | AWS::RDS::DBClusterParameterGroup | ClusterParameterGroupV24FABFF22
3/4 Currently in progress: CdkWorksStack, ClusterParameterGroupV24FABFF22
CdkWorksStack | 3/4 | 2:03:07 | DELETE_FAILED | AWS::RDS::DBClusterParameterGroup | ClusterParameterGroupV24FABFF22 One or more database instances are still members of this parameter group cdkworksstack-clusterparametergroupv24fabff22-sphpqndefxsz, so the group cannot be deleted (Service: Rds, Status Code: 400, Request ID: 79279e80-28e0-4928-8bcb-bb2ecf78e7c0)
3/4 Currently in progress: CdkWorksStack
CdkWorksStack | 3/4 | 2:06:09 | DELETE_IN_PROGRESS | AWS::RDS::DBClusterParameterGroup | ClusterParameterGroupV24FABFF22
3/4 Currently in progress: CdkWorksStack, ClusterParameterGroupV24FABFF22
CdkWorksStack | 3/4 | 2:08:19 | DELETE_FAILED | AWS::RDS::DBClusterParameterGroup | ClusterParameterGroupV24FABFF22 One or more database instances are still members of this parameter group cdkworksstack-clusterparametergroupv24fabff22-sphpqndefxsz, so the group cannot be deleted (Service: Rds, Status Code: 400, Request ID: cf80478d-2a8c-4573-9d73-f5601173966d)
CdkWorksStack | 4/4 | 2:08:19 | UPDATE_COMPLETE | AWS::CloudFormation::Stack | CdkWorksStack Update successful. One or more resources could not be deleted.
Failed resources:
CdkWorksStack | 1:57:57 | DELETE_FAILED | AWS::RDS::DBClusterParameterGroup | ClusterParameterGroupV24FABFF22 One or more database instances are still members of this parameter group cdkworksstack-clusterparametergroupv24fabff22-sphpqndefxsz, so the group cannot be deleted (Service: Rds, Status Code: 400, Request ID: 56e462f8-3b08-42fd-af65-7d3d02890bff)
CdkWorksStack | 2:03:07 | DELETE_FAILED | AWS::RDS::DBClusterParameterGroup | ClusterParameterGroupV24FABFF22 One or more database instances are still members of this parameter group cdkworksstack-clusterparametergroupv24fabff22-sphpqndefxsz, so the group cannot be deleted (Service: Rds, Status Code: 400, Request ID: 79279e80-28e0-4928-8bcb-bb2ecf78e7c0)
CdkWorksStack | 2:08:19 | DELETE_FAILED | AWS::RDS::DBClusterParameterGroup | ClusterParameterGroupV24FABFF22 One or more database instances are still members of this parameter group cdkworksstack-clusterparametergroupv24fabff22-sphpqndefxsz, so the group cannot be deleted (Service: Rds, Status Code: 400, Request ID: cf80478d-2a8c-4573-9d73-f5601173966d)
✅ CdkWorksStack
✨ Deployment time: 796.56s
Outputs:
CdkWorksStack.ClusterEndpoint = cdkworksstack-auroracluster23d869c0-syyatnttzsy3.cluster-c9gfiupnyvrf.ap-northeast-1.rds.amazonaws.com
CdkWorksStack.ClusterReadEndpoint = cdkworksstack-auroracluster23d869c0-syyatnttzsy3.cluster-ro-c9gfiupnyvrf.ap-northeast-1.rds.amazonaws.com
CdkWorksStack.PrivateSubnets = subnet-0c3b97d73000d559f,subnet-083c86ef5b989e78b,subnet-04bf5b0ef89239a28
CdkWorksStack.PublicSubnets = subnet-09120e51b664721ff,subnet-0e0926580e6e4ab28,subnet-01d48cd680d622f1b
CdkWorksStack.SecretName = CdkWorksStackAuroraClusterS-YXBmzxIoq1oU
CdkWorksStack.VpcId = vpc-0d9059beb8b8922d5
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/CdkWorksStack/922cbe30-d5fe-11ef-938e-0aa401847f63
✨ Total time: 808.06s
NOTICES (What's this? https://github.com/aws/aws-cdk/wiki/CLI-Notices)
31885 (cli): Bootstrap stack outdated
Overview: The bootstrap stack in aws://123456789012/ap-northeast-1 is outdated.
We recommend at least version 21, distributed with CDK CLI
2.149.0 or higher. Please rebootstrap your environment by
runing 'cdk bootstrap aws://123456789012/ap-northeast-1'
Affected versions: bootstrap: <21
More information at: https://github.com/aws/aws-cdk/issues/31885
If you don’t want to see a notice anymore, use "cdk acknowledge <id>". For example, "cdk acknowledge 31885".
終わりに
AWS CDK で作られた Amazon Aurora MySQL v2 を Blue/Green Deployments で Aurora MySQL v3 へアップグレードするのを試してみました。
Blue/Green Deployments の作成と切り替え、削除は CDK 外で行う必要がありますが、切り替え後の実態とCDK のコードを合わせた状態で cdk deploy を行うことで、そのまま何事もなくデプロイ可能なようでした。