Posted at

Amazon DynamoDBへのインポート処理を書いた


はじめに

最近、個人開発でもAWSを使い始めたものの、ちょっと難しそうだなぁ…と思って敬遠していたDynamoDB。

「ちょっと試しに使ってみようかな」と思い、まずテスト用にデータをインポートしてみよう、と思ったものの、結局、簡単なツールを作って対応することになったので、経緯などを記事に起こしておきます。


経緯


こんなデータをインポートしたいんだけど…

いつものごとく競馬系の個人開発をしていたので、以下のようなデータをDynamoDBにインポートしよう…と思いました。

ここでは4レコードだけの記載ですが、実際は約290個くらいのレコードを対象としていました。

[

{
"Date": "20190105",
"Course": "京都",
"GradedRaces": [
"スポーツニッポン賞京都金杯"
]
},
{
"Date": "20190105",
"Course": "中山",
"GradedRaces": [
"日刊スポーツ賞中山金杯"
]
},
{
"Date": "20190106",
"Course": "京都",
"GradedRaces": [
"日刊スポーツ賞シンザン記念"
]
},
{
"Date": "20190106",
"Course": "中山",
"GradedRaces": []
}
]


当然バッチ登録するツールあるよね…

ということで「当然バッチ登録するツールはあるよね」ということでgoogle先生に調べてもらいました。

「aws dynamodb batch-write-item」ってのが使えそう…ということで、Amazonさんのドキュメントを確認…


If one or more of the following is true, DynamoDB rejects the entire batch write operation:

* There are more than 25 requests in the batch.


う〜ん、バッチ内に25件以上あるとバッチ書き込みはできないのか…

ここを見ると、仮に25件以上のデータに対して使えたとしてもjsonのフォーマット変換しないと使えなさそうだ…


いいやツール作っちゃえ

他にも方法ありそうだけど、大したコーディング量でもないからツール作ってしまえ、となりました。


実装

同じことをやっている人はたくさんいそうなので、まぁありがちな内容ですが…

参考にしたのはこのBoto3のドキュメントです。


dynamoimport.py


"""jsonファイルの内容をDynamoDBにインポートする."""
import json
from argparse import ArgumentParser, FileType

import boto3
from tqdm import tqdm

def main():
"""メイン関数."""
p = ArgumentParser(description='jsonファイルの内容をDynamoDBにインポートする')
p.add_argument('table', help='テーブル名')
p.add_argument('json', type=FileType('r'), help='インポート内容記載したjsonファイル')
args = p.parse_args()

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(args.table)
items = json.load(args.json)

with table.batch_writer() as batch:
for item in tqdm(items):
batch.put_item(Item=item)

if __name__ == "__main__":
main()


使い方としては

python dynamoimport.py テーブル名 jsonファイル

です。

異常系の処理は何も書いてないので、実際使う際にはそのへんケアしてあげてくださいませ。

なお、githubにもソースあげてあります。


おわりに

DynamoDBは癖が強いなあ…と思いつつ、AWSで個人開発していく上では必要なサービスだと思っているので、これを機に(?)、仲良くやっていきたいなぁと思ってます。