以下の内容はhttps://dshimizu.hatenablog.com/entry/2024/12/21/203809より取得しました。


AWS CDK で作られた Amazon Aurora MySQL v2 を手動で Blue/Green Deployments で v3 へアップグレードし、CDK コードを実態に合わせて修正してデプロイを試した

はじめに

Amazon Aurora MySQL v2系の標準サポートが2024年10月31日に終了しました。

repost.aws

Aurora MySQLをv2系からv3系へアップグレードについて、Amazon Aurora Blue/Green Deployments を用いてのアップグレードを試しました。

Amazon Aurora Blue/Green Deployments

Amazon Aurora Blue/Green Deployments は、稼働中の環境(Blue環境)から、論理レプリケーションによってデータを複製された新しい環境(Green環境)を作成できます。

docs.aws.amazon.com

稼働中の環境(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 クラスターの engineparameterGroup の部分を 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ではないので大丈夫なはずです。

デプロイを試します。

% 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 を行うことで、そのまま何事もなくデプロイ可能なようでした。

参考




以上の内容はhttps://dshimizu.hatenablog.com/entry/2024/12/21/203809より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14