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

2019-04-03
2019-05-08

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

DynamoDBが定番

DynamoDBが定番で基本は大人しくDynamoDBを使うのがいいと思う。
コスト面でも圧倒的に有利。小さな個人サービスなどであれば月数ドルで済む(ただしテーブルをたくさん作るとそれだけかかるお金が増えていく)

不適なケースもある

DynamoDBはシンプルなクエリを大量にさばくような状況では強いが、複雑なクエリには対応できず、また集計周りが弱いのでDynamoDBで要件を満たせるかどうかはよく検討する必要がある。
単純なカウント処理でも全件スキャンとなりコストがかさむ。

集計周りDynamoDB Streamsを使って別のLambda関数を発火させて集計の更新処理を行ったり、集計内容を一定時間キャッシュするなどでカバーすることは可能だが、一手間一工夫が必要となる。

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

Aurora Serverless

複雑なクエリを使いたいならAurora。
Lambdaから通常のAuroraを利用するとLambdaからDBへのコネクション数の飽和という致命的な問題が発生するが、Aurora Serverlessならこれは解決できる。

現時点で留意すべき問題

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

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

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

ハイブリッド

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

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

Profile

フルスタック気味のフリーランスプログラマー。

どちらかと言うと得意はインフラ構築とサーバーサイドプログラミングですが、フロントエンドもぼちぼちやっています。

最近の興味範囲はWordPress、AWS、サーバーレス、UIデザイン。

愛車はセロー。カメラはペンタックス。旅好きです。横浜在住。