CDKでAurora PostgreSQLをServerless v2にするとParameterGroupとengine modeで弾かれる

  • AWS
  • CDK
  • Aurora
  • PostgreSQL

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

CDKでAurora PostgreSQLのクラスターを作ろうとして、続けて2つのエラーにぶつかった。どっちもエンジンのバージョン指定周りが原因だった。

起きたこと

最初に出たのがこれ。

Could not create a new ParameterGroup for an unversioned aurora-postgresql cluster engine.
Please either use a versioned engine, or pass an explicit ParameterGroup when creating the cluster

バージョンを指定して回避したら、次はこっち。

The engine mode serverless you requested is currently unavailable.

ParameterGroupのエラーについて

DatabaseClusterEngine.AURORA_POSTGRESQLのようにバージョンを指定しない状態(unversioned engine)でクラスターを作ろうとすると、CDKが自動生成しようとするParameterGroupがどのバージョン向けか決められずに弾かれる。

CDKのGitHub Issue(aws-cdk#13936, #14031)にも同じ内容の報告があって、unversionedなエンジンにParameterGroupを紐付けることはできない、非serverlessクラスターでunversionedエンジンを使うのは可用性リスクだから非推奨、と書いてあった。

直し方は2通り。

エンジンのバージョンを明示する。

engine: rds.DatabaseClusterEngine.auroraPostgres({
version: rds.AuroraPostgresEngineVersion.VER_15_2,
}),

もしくは、バージョン指定なしのままにしたいなら明示的にParameterGroupを渡す。

const parameterGroup = new rds.ParameterGroup(this, 'MyParamGroup', {
engine: rds.DatabaseClusterEngine.auroraPostgres({
version: rds.AuroraPostgresEngineVersion.VER_15_2,
}),
parameters: {
log_min_duration_statement: '1000',
},
});

ただしParameterGroup自体を作るときはバージョン指定必須なので、結局どこかでバージョンは決めることになる。

engine mode serverlessのエラーについて

こっちはAurora Serverless v2固有の話。今回自分がぶつかった原因は主に3つ。

  • 指定したPostgreSQLのバージョンがServerless v2に対応していない
  • リージョンがServerless v2に対応していない
  • serverlessV2MinCapacity / serverlessV2MaxCapacityを指定していない

現時点(2025年3月)でServerless v2が対応しているPostgreSQLの最小バージョンはざっくり13.6 / 14.3 / 15.2以降らしい。ただしこの辺はマイナーバージョンの更新で最小要件が上がることがあるようなので、実際に使うバージョンで通るかどうかはaws rds describe-orderable-db-instance-optionsで確認したほうが確実だと思う(未確認)。

capacityの指定はこんな感じ。

serverlessV2MinCapacity: 0.5,
serverlessV2MaxCapacity: 4,

ServerlessClusterかDatabaseClusterか

もう一つ引っかかったのが、CDKのL2コンストラクトのどっちを使うかという話。

rds.ServerlessClusterはAurora Serverless v1専用で、Serverless v2では使わない。v2の場合はrds.DatabaseClusterにserverlessV2MinCapacityとserverlessV2MaxCapacityを渡す形になる。

const cluster = new rds.DatabaseCluster(this, 'MyAuroraCluster', {
engine: rds.DatabaseClusterEngine.auroraPostgres({
version: rds.AuroraPostgresEngineVersion.VER_15_2,
}),
vpc,
serverlessV2MinCapacity: 0.5,
serverlessV2MaxCapacity: 4,
credentials: rds.Credentials.fromGeneratedSecret('admin'),
defaultDatabaseName: 'mydatabase',
});

名前だけ見るとServerlessClusterの方がそれっぽく見えるけど、v2を使うつもりならこっちは選ばない。

Aurora Serverless v1自体は2025年3月31日でEOLが予定されているので、新規で作るならv1を選ぶ理由はもうなさそう。