はじめに
先日 AWS Cloud Development Kit(CDK)のバージョン2.82.0がリリースされました。
リリース内容を確認したところ、待望のAurora Serverless v2が利用可能になっておりましたので早速試してみました。
いつもCDKのアップデートツイートを楽しみにしております。
AWS CDK v2.82.0 新機能✨#cdk_releases
⑥Aurora Serverless v2を利用可能に。設計時の判断を記述するArchitecture Decision Record (ADR) も公開されているため興味がある方はご覧ください https://t.co/hVba6946vj— Kenji Kono (@konokenj) June 2, 2023
目次
やってみた
既存のDBクラスター上にプロビジョニングされたインスタンスが2台ある想定で
クラスターを変更せずに、インスタンスを入れ替える実験をしてみたいと思います。
実験開始前
2つのdb.t4g.mediumのインスタンスが構成されています。
CDKのソースコードはこのように定義されています。
ソースコードのコメントにも記載していますが注意点が2つありますので解説します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
export class Aurora extends Construct { public readonly rdsInstance: rds.DatabaseInstance; constructor(scope: Construct, id: string, props: AuroraProps) { super(scope, id); const aurora_cluster = new rds.DatabaseCluster(this, 'Database', { // Aurora Serverless v2を使用するには、"Aurora MySQL 3.02.0 (MySQL 8.0.23)"以上である必要があります engine: rds.DatabaseClusterEngine.auroraMysql({ version: rds.AuroraMysqlEngineVersion.VER_3_02_0 }), // --------------- CDK v2.82.0以前のPropsの定義---------------- // v2.82.0以降では、下記設定は非推奨となります instances: 2, instanceProps: { vpc: props.cmnProps.vpc!, vpcSubnets: { subnets: [ props.cmnProps.privateSubnetProps!.privateSubnet01, props.cmnProps.privateSubnetProps!.privateSubnet02 ] }, securityGroups: [ props.cmnProps.sgProps!.auroraSg ], instanceType: ec2.InstanceType.of(InstanceClass.T4G, InstanceSize.MEDIUM), }, |
注意点1 Auroraエンジンの利用可能なバージョン
Aurora Serverless v2に対応しているバージョンは決まっており
Aurora MySQL 3.02.0 (MySQL 8.0.23)以上である必要があります。
同一クラスターを対応バージョンに更新する際には、機能停止が発生しますのでご注意ください。
注意点2 Construct Propsのinstances 及び instancePropsが非推奨
CDKのv2.82.0以前で使用していたConstruct Propsのinstances 及び instancePropsが非推奨となりました。
writerやreadersを個々に設定出来ることになった関係で非推奨となったそうです、納得の理由ですね。
リファレンスの方でもしっかりと非推奨の記載の確認が取れました。
v2.82.0にアップデートした際にはAurora Serverless v2対応に限らず、Construct Propsの定義を変更した方が良さそうです。
CDKのソースコードを変更!
CDKの定義を変更してみます。
まずは変更後のソースコード全体を載せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
export class Aurora extends Construct { public readonly rdsInstance: rds.DatabaseInstance; constructor(scope: Construct, id: string, props: AuroraProps) { super(scope, id); const aurora_cluster = new rds.DatabaseCluster(this, 'Database', { // Aurora Serverless v2を使用するには、"Aurora MySQL 3.02.0 (MySQL 8.0.23)"以上である必要があります engine: rds.DatabaseClusterEngine.auroraMysql({ version: rds.AuroraMysqlEngineVersion.VER_3_02_0 }), // --------------- CDK v2.82.0以降のPropsの定義---------------- // VPCやサブネット、セキュリティグループ周りはinstancePropsの外で定義する形に変更となります。 vpc: props.cmnProps.vpc!, vpcSubnets: { subnets: [ props.cmnProps.privateSubnetProps!.privateSubnet01, props.cmnProps.privateSubnetProps!.privateSubnet02 ] }, securityGroups: [ props.cmnProps.sgProps!.auroraSg ], // serverlessV2の最大・最小ACUの設定(共通) serverlessV2MaxCapacity: 2.0, serverlessV2MinCapacity: 0.5, writer: rds.ClusterInstance.serverlessV2('01', { autoMinorVersionUpgrade: false, }), readers: [ // 1つ目のリーダー:サーバレスタイプを指定 // scaleWithWriterをTrueにすることで、ライターと一緒にスケールアップします rds.ClusterInstance.serverlessV2('02', { scaleWithWriter: true, autoMinorVersionUpgrade: false, }), // 2つ目のリーダー:プロビジョニングタイプを指定 rds.ClusterInstance.provisioned('03', { instanceType: ec2.InstanceType.of(InstanceClass.T4G, InstanceSize.MEDIUM), autoMinorVersionUpgrade: false, }), ], |
まずは非推奨となったpropsを移行します。
vpcやサブネット、セキュリティグループは同じ設定内容です。
1 2 3 4 5 6 7 8 9 10 11 |
// VPCやサブネット、セキュリティグループ周りはinstancePropsの外で定義する形に変更となります。 vpc: props.cmnProps.vpc!, vpcSubnets: { subnets: [ props.cmnProps.privateSubnetProps!.privateSubnet01, props.cmnProps.privateSubnetProps!.privateSubnet02 ] }, securityGroups: [ props.cmnProps.sgProps!.auroraSg ], |
次にserverlessV2の最大・最小ACUの設定です。
こちらは共通の設定となりますので、writerとreadersで別々の最大・最小の設定は出来ません。
1 2 3 |
// serverlessV2の最大・最小ACUの設定(共通) serverlessV2MaxCapacity: 2.0, serverlessV2MinCapacity: 0.5, |
そしてこちらがメインディッシュです。
writerにサーバレスタイプのインスタンスを1台配置
readersにサーバレスタイプ/プロビジョニングタイプのインスタンスを1台ずつ配置
以前まではinstancePropsで全インスタンスで共通の設定しか出来なかったため、個々に定義が出来ませんでした。
これは非常に有り難いアップデートですね。
1 2 3 4 5 6 7 8 9 10 11 12 |
writer: rds.ClusterInstance.serverlessV2('01', {}), readers: [ // 1つ目のリーダー:サーバレスタイプを指定 // scaleWithWriterをTrueにすることで、ライターと一緒にスケールアップします rds.ClusterInstance.serverlessV2('02', { scaleWithWriter: true, }), // 2つ目のリーダー:プロビジョニングタイプを指定 rds.ClusterInstance.provisioned('03', { instanceType: ec2.InstanceType.of(InstanceClass.T4G, InstanceSize.MEDIUM), }), ], |
さぁ、CDK deploy
さてCDK deployをしてみましょう!
ですが、その前にdiffを取って差分確認ですね。
修正差分が想定通りなのがお分かりかと思います。
さぁ、次こそCDK deployを実施しましょう。
deploy中の挙動を見てみますと、追加した3つのインスタンスが作成中になっております。
この時は3つともリーダーインスタンスとして一時的に扱われるそうですね。
次に元々構築されていたプロビジョニングタイプの2つのインスタンスが削除中になります。
ですが、この時点ではライタークラスのままになっています。
そのため一時的にクラスターエンドポイントへの接続は出来ていない状態かと思います。
(この辺りは別の機会にTryしてみたいと思います)
正確な時間は計測出来ていませんが、数分程度でCDKで定義したServerlessタイプのインスタンスがライターへと昇格しています。
自動的にフェイルオーバーされているようです。
デプロイ開始から完了まで約20分程で、無事に全ての更新が完了しました。
しっかりとCDKで定義した通りの結果になっています。
またクラスターエンドポイントもインスタンス追加前から変更されていないことも確認しています。
感想
最近Aurora Serverless v2の検証をする機会が多く
CDKで簡単に構築出来たらいいなぁと思っていたところ、有り難いバージョンアップの情報が舞い込んできました。
さすが、L2 Constructですね。
Serverless v2の設定も想像以上に簡単に出来ました。
また個々にインスタンスを設定出来るようになったのは大きいアップデートと感じました。
参考記事
投稿者プロフィール
-
2021/2にスカイアーチネットワークスにJoin。
(前職ではAIのシステム開発やPoCなどを主に担当)
2024 Japan AWS Top Engineers (Services)
2024 Japan AWS All Certifications Engineers
現在の業務では主にクラウドネイティブなWebアプリケーション/APIのインフラ構築から開発まで幅広く担当。
好きなAWSサービス:AWS CDK、Amazon Bedrock
趣味:読書と競馬鑑賞