Lambdaで使うDBをDynamoDBにするかAurora Serverlessにするか

2019年4月時点での判断材料。

DynamoDBが定番で基本は大人しくDynamoDBを使うのがいいと思う。
コスト面でも圧倒的に有利だし。

ただDynamoDBは集計が弱い(単純な全件カウントですら高コスト)ので場合によってはそれをカバーするために余計な要件(DynamoDB Streamsを使って別のLambda関数を発火させて集計の更新処理を行うなど)が増えてしまい煩わしくなる面もある。
複雑なクエリを使いたいならAurora Serverlessという選択も。

適切な選定のためRDBMSとNoSQLの相違点を分かりやすく説明してくれるAWS公式のDynamoDBのベストプラクティスは必読。

LambdaとAuroraはいくつかの点で相性が悪いがAurora Serverlessを使うことでLambdaからDBへのコネクション数の飽和という致命的な問題は解決できる。

現時点でLambdaとAurora Serverlessについて残っている問題は以下の二点。

  • Auroraのデータベースインスタンスが全て落ちていると起動に30秒〜1分くらいかかる
  • AuroraにアクセスするためにVPC上に置いたLambda関数が起動するのに10秒から30秒くらいかかる

いずれも一度起動してウォームアップすればすぐにアクセスできるようになるため回避は可能。
前者の問題はアイドルになるまでの時間を24時間にするなど長くしておけば解決できる。データベースインスタンスが常に稼働している形になるため費用は最低でも$150/月くらいかかる。
後者の問題は2019年中にはアップデートで解消されるらしい。現時点でも定期的にポーリングするようにしておけば大丈夫?

妥当かどうかは分からないがDynamoDBで受けてDynamoDB Streamsを使って別のLambda関数を発火させてAurora Serverlessに書き込むといったハイブリッドなこともできる。DynamoDB Streamsを使った処理でリアルタイム性は担保されない(遅延する可能性がある)が通常は準リアルタイムといって良いくらいの速度で反映される。

ただリアルタイム性が必要無ければエクスポートしてExcelで集計するといった手段も有効なので運用も加味して柔軟に判断していきたい。難しみ。