Aurora Serverless v2、ReaderをCDKで足さないとスケールアウトはしない

  • AWS
  • CDK
  • Aurora

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

Aurora Serverless v2をCDKで組むとき、DatabaseClusterにWriter/Readerをどう定義すればいいか迷ったので整理した。

結論

  • Writerだけあれば動く。Readerは任意
  • Reader無しでも自動でスケールする(ただしACUのスケールアップの話)
  • インスタンスの数(Readerの追加)は基本的に自動では増えない

「自動スケール」という言葉に、垂直(ACU増減)と水平(インスタンス数)の2つの意味が混ざっているのが混乱の原因だった。

CDKでの最小構成

Writerだけならこれで十分。

const cluster = new rds.DatabaseCluster(this, 'Cluster', {
engine: rds.DatabaseClusterEngine.auroraPostgres({
version: rds.AuroraPostgresEngineVersion.VER_16_4,
}),
writer: rds.ClusterInstance.serverlessV2('writer'),
serverlessV2MinCapacity: 0.5,
serverlessV2MaxCapacity: 4,
});

Readerが必要になったらreadersに追加する。

readers: [
rds.ClusterInstance.serverlessV2('reader1', { scaleWithWriter: true }),
],

ACUのスケール(垂直)は常に自動

WriterもReaderも、それぞれのACUは負荷に応じて自動で増減する。これはReaderの有無に関係ない。Writer単体構成でも、書き込み・読み取り両方の負荷でACUが動く。

インスタンス数(水平)は基本手動

Readerを1台から3台に増やす、みたいな話は自動では起きない。CDKやコンソールから明示的に追加する必要がある。

ただし例外がある。Application Auto Scalingのポリシーをクラスターに設定すれば、Reader自体の追加・削除を自動化することもできるらしい(自分では未検証)。デフォルトの挙動としては「Reader数は固定、増やすなら手動」と考えておけば大きく外さない。

scaleWithWriterとpromotion tierの落とし穴

Readerを追加するとき、scaleWithWriterオプションとpromotion tierの組み合わせで挙動が変わる。

AWSの公式ドキュメントには、promotion tierが0か1でないReaderは、Writerと一緒にスケールしない場合があると書かれている。つまり「WriterとReaderはそれぞれ独立してACUがスケールする」という理解は、tier設定次第で条件が変わる。

フェイルオーバー用に昇格させたいReaderなら、tierとscaleWithWriterの設定をちゃんと合わせておかないと、いざという時にACUが足りない状態でPromoteされることになりそう。

構成の考え方

flowchart TD
  A[サービス開始] --> B[Writerのみ]
  B --> C{読み取り負荷が増える}
  C -->|Yes| D[Readerを1台追加]
  C -->|No| B
  D --> E{さらに増える}
  E -->|Yes| F[Readerを追加/tier調整]
  E -->|No| D

  classDef start fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e;
  classDef decision fill:#fef9c3,stroke:#ca8a04,color:#713f12;
  classDef action fill:#dcfce7,stroke:#16a34a,color:#14532d;

  class A,B start
  class C,E decision
  class D,F action

最初はWriterのみで様子を見て、読み取り負荷が上がってきたらReaderを足す、という順番で問題ない。ACUのスケールアップだけである程度は吸収できるので、Reader追加は本当に必要になってからで十分そう。

まとめると

  • 「自動スケール」=ACUの話。インスタンス数の話ではない
  • Reader追加はデフォルト手動。Auto Scalingポリシーを組めば自動化もできるが未検証
  • Readerのpromotion tierとscaleWithWriterはセットで考える必要がある