はじめに
最近、個人開発でも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のドキュメントです。
"""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で個人開発していく上では必要なサービスだと思っているので、これを機に(?)、仲良くやっていきたいなぁと思ってます。