DynamoDB へのデータインポートって意外と大変!

こちらの記事は アソビュー! Advent Calendar 2023 の23日目(B面)です。

こんにちは。アソビューでバックエンドエンジニアをやっている 五十嵐 です。
やっと寒くなってきてクリスマス感も出てきましたね!(もう明後日ですが・・・!!)
我が家は家族みんなが体調を崩していましたが、みなさまも体調に気をつけて、楽しいクリスマス & お正月をお迎えください!

さて、今回は Amazon DynamoDB について触れてみたいと思います。

DynamoDB について

Amazon DynamoDBは、Amazon Web Services(AWS)が提供する高速スケーラブル、高い堅牢性も備えた NoSQLデータベースサービス です。 そのため、高速な読み書き や 高い可用性・堅牢性 が必要とされる キャッシュ や ログデータ、セッション情報 などの管理に利用されることが多いかと思います。

弊社でも DynamoDB を以前より利用していますが、今回、テストデータを DynamoDB のテーブルへインポートするにあたり困ったことがあったため、その辺りを共有させていただきます。

データインポート

データのインポート機能は DynamoDB のコンソール画面から提供されており、下記のように画面のナビゲーションに従って操作していけば、 Amazon S3 に配置されているファイルデータをインポートすることが可能です。

今回、私が行いたかったことは「既存テーブル へ1万件程度のデータをインポートする」ということで、 最初、この機能を利用すればよさそうだなぁっと楽観的に考えていました。
・・・が、実はこの機能はあくまでも新規テーブルへのデータインポート機能であって、既存テーブルへは対応していないのです。

ではどうすれば良いのか・・・。はい、ちゃんと API が用意されていました。

BatchWriteItem

docs.aws.amazon.com

DynamoDB には BatchWriteItem という API が用意されており、これは 1つまたは複数のテーブルに対して複数の項目を挿入または削除する操作が可能です。

ただし、下記のような制限事項があります。

  • 1回の操作で挿入・削除できる項目数は最大25個
  • 1回のデータ転送における最大データサイズは16MB
  • 1項目の最大データサイズは400KB

また、この API の入力となる JSONファイル の書式も少し複雑です。

( API リファレンスページよりデータ例を引用 )

上記API を直接呼ぶことでデータインポートを実現できますが、AWS SDK よりこのAPIをラップした API を呼び出すことが可能です。

AWS SDK

docs.aws.amazon.com

AWS SDK を利用することで、複雑な構造であるJSONへのデータバインドをあまり意識する必要がなく、 また、1回の操作における項目数やデータサイズの制限に対応するためのリトライ処理が容易に実装できるため、 AWS SDK を利用することをオススメします。

AWS SDK は様々な言語向けに用意されており、馴染みのある言語のSDKを利用してもらえば良いと思いますが、 例えば、AWS SDK for Java の場合は下記のような書き方で実装できます。

ProductCatalog テーブル での例

属性名 タイプ プライマリキー
Id 数値 Yes
Title 文字列 No
Price 数値 No


さらに、CSVからインポートを実現したい場合は、下記のように実装することが可能です。

CSV 書式例

  • 先頭行を 属性名 : 型 という書式で扱います

CSV ファイルからのインポート例

上記のように CSV や JSONファイルを読み込んで、Itemクラスにバインドしてあげ、それらを TableWriteItems クラスに追加することで、 任意のファイルを DynamoDB のテーブルへインポートすることが可能となります。

皆さんも私と同様な局面に出会したら、上記のようなアプローチで簡易的なインポートツールを作成してみてはいかがでしょうか。

さいごに

アソビューでは「生きるに、遊びを。」を実現していくために、今後もプロダクトをさらに成長させていく必要があり、その仲間をまだまだ募集しております。 少しでも興味を持っていただけた方は、ぜひエントリーを検討してみてください!

www.asoview.com

speakerdeck.com