前置き
以前、担当プロジェクトで導入したDynamoDBと
DynamoDB導入前に利用していたRDS(MySQL)のデータを同期した際の話になります。
事例の紹介であり具体的な実装方法を紹介する記事ではないのでご了承下さい。
要件など
フロントエンド上でのユーザアクションによるイベント情報(操作の履歴)をDynamoDBに格納しているWEBアプリケーションが存在し、アプリケーションのコンテンツ情報を管理およびレポート出力を行うためのCMSアプリケーションが別途存在する環境でした。
CMS上からフロントエンド上でのイベント情報のレポート出力をする際にDynamoDBから複雑な条件でデータ抽出を行うには、高い値のスループット値の設定が必要であり費用対効果に難があることと複雑な条件でデータの集計を行うのに向いていないため、RDSにDynamoDB上のデータを同期しRDSからデータを抽出して高速にレポートを出力する必要がありました。
今回のアプローチ
DynamoDBとRDS上のデータを同期する際に行ったアプローチは下記のフローとなります。
- DynamoDB Streamsを利用しDynamoDBへのデータ追加および更新・削除を検知
- Lambda Function上でSQSキューにメッセージを送信しSQSキューにデータ変更情報を格納
- CMSサーバ上でバッチ処理にてSQSキューからメッセージ取得、およびRDSへのデータ追加・更新・削除処理
- CMSからRDSのデータを参照しレポートを出力
各ソリューションについて
DynamoDBにいて
まずは公式ドキュメントを。Amazon DynamoDB
- 端的に言うならばお金で性能が買えるスキーマレスなNoSQLデータベースです。
- デメリットとしてはMySQLのようなRDBMSのSQLによる複雑なデータ抽出には向いていない点が挙げられます。
DynamoDB Streamsについて
詳しくは公式ドキュメントを参考にしてください。
DynamoDB ストリーム を使用したテーブルアクティビティのキャプチャ
Amazon DynamoDB のトリガー
Amazon DynamoDB は AWS Lambda と統合されているため、トリガー(DynamoDB ストリーム 内のイベントにすばやく自動的に応答するコード)を作成できます。トリガーを使用すると、DynamoDB テーブル内のデータ変更に対応するアプリケーションを構築できます。
テーブルで DynamoDB ストリーム を有効にした場合、書き込む Lambda 関数にストリーム ARN を関連付けることができます。テーブル内の項目が変更されるたびに、新しいストリームレコードがテーブルのストリームに出現し、その後 Lambda 関数がトリガーされて実行されます。
- DynamoDB Streamsを有効にしLambda FunctionにストリームARNを関連付けることでLambda側でDynamoDBのデータ更新を常にキャッチすることができます。
Lambdaについて
AWS Lambda はイベント発生時にお客様のコードを実行し、基盤となるインフラストラクチャをお客様に代わって管理するサービスです。AWS Lambda を使用してカスタムロジックで他の AWS サービスを拡張したり、AWS の規模、パフォーマンス、セキュリティで稼働する独自のバックエンドサービスを作成したりできます。AWS Lambda は Amazon S3 バケットのオブジェクト、Amazon SNS から送信された通知、Amazon Kinesis ストリームが受信したメッセージ、Amazon DynamoDB テーブルの更新に対応して自動的にコードを実行します。
AWS Lambda は可用性の高いコンピューティングインフラストラクチャでお客様のコードを実行し、コンピューティングリソースの管理をすべて担当します。これにはサーバーおよびオペレーティングシステムの管理、キャパシティーのプロビジョニングおよび自動スケーリング、コードおよびセキュリティパッチのデプロイ、モニタリングおよびロギングなどが含まれます。お客様はコードを書くだけです。
- 今回のプロジェクトではnode.js版のLambdaにて実装しました。
- この記事を書いた時点ではnode.js, JAVA, Pythonに対応しているようです。
- 今回の実装内容としては、DynamoDB Streamsで検知した更新内容をパースしSQSにメッセージを送信する内容となりました。
SQSについて
Amazon Simple Queue Service (SQS)
Amazon Simple Queue Service(SQS)は、高速で、信頼性が高く、スケーラビリティに優れ、十分に管理されたメッセージキューサービスです。SQS を利用すると、簡単かつコスト効率良く、クラウドアプリケーションのコンポーネントを切り離すことができます。SQS を使用すれば、どんなボリュームのデータでもあらゆるレベルのスループットで転送できます。転送時にメッセージが失われることも、他のサービスが常に利用可能である必要もありません。
- SQSは比較的歴史のあるAWSサービスのためAWS SDKは多様な言語に対応しています。
- サンプルについてはコチラから見ることができます。
結果
今回行ったアプローチについては前述の「今回のアプローチ」に記載した通りとなります。
以下は今回のアプローチによる結果です。
- フロントエンドのWEBアプリケーションではDynamoDBを採用しユーザアクション起因の動的処理を安定・高速に処理することができた。
- バックエンドのCMSアプリケーションではRDSからデータを参照することで高速にレポートを出力することができた。
- DynamoDBとRDSの併用という適材適所でソリューションを採用することが費用面でも性能面でも効果的であることが体験できた。