DynamoDBに登録するデータをスプレッドシートで一括作成する

Google スプレッドシートのデータを関数でJSONに変換し、Amazon DynamoDBに一括で登録する
2019.10.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部、池田です。
7月に入社以来、一番触っている技術(?)はGoogle スプレッドシートExcelでした。 ヨソウガイデス…(嫌な訳ではありません。) 最近はチームでの自分の役割を説明する時に「スプレッドシートとExcel担当です。」って言ってます。
そんな訳で、この夏のスプレッドシートの思い出の中で、 Amazon DynamoDBへの一括登録用のデータ作成を紹介します。

スプレッドシートでデータを生成する

スプレッドシートに登録したいデータを記入して、関数でJSONに整形します。

Python(Boto3)で登録するために、JSONは以下の形式にしておきます。

{
    "RequestItems": {
        "{テーブル名}": [
            {
                "PutRequest": {
                    "Item": {
                        "{登録するKey1}": "{登録するValue1}",
                        "{登録するKey2}": "{登録するValue2}"
                    }
                }
            },
            {
                "PutRequest": {
                    "Item": "{次のアイテムのKey-Value情報}"
                }
            }
        ]
    }
}

RequestItemsキーとテーブル名のキーは登録処理のスクリプトで後付けするので、 スプレッドシートではPutRequest群の配列部分までを、関数で作成します。

今回はサンプルデータとして、弊社 岩本町オフィス の近辺の駅とその隣接する3駅の情報を使用しています。

  • A2計算式: =IF(ROW()=2,"[","")&"{""PutRequest"":{""Item"":{""id"":"""&B2&""",""name"":"""&C2&""",""line"":"""&D2&""",""destinations"":["&E2&"],""msg"":"""&F2&"""}}}"&IF(ROW()=COUNTA(B:B),"]",",")

A列をコピーして、エディタなどで整形した結果のJSONが以下です。

クリックでコードを表示する/折りたたむ
[
    {
        "PutRequest": {
            "Item": {
                "id": "S-08",
                "name": "岩本町",
                "line": "都営新宿線",
                "destinations": ["小川町", "神保町", "九段下"],
                "msg": "{env}のアイテムです。"
            }
        }
    },
    {
        "PutRequest": {
            "Item": {
                "id": "JK27",
                "name": "神田",
                "line": "京浜東北線",
                "destinations": ["秋葉原", "御徒町", "上野"],
                "msg": "{env}のアイテムです。"
            }
        }
    },
    {
        "PutRequest": {
            "Item": {
                "id": "JY02",
                "name": "神田",
                "line": "山手線",
                "destinations": ["秋葉原", "御徒町", "上野"],
                "msg": "{env}のアイテムです。"
            }
        }
    },
    {
        "PutRequest": {
            "Item": {
                "id": "JC02",
                "name": "神田",
                "line": "中央線",
                "destinations": ["御茶ノ水", "水道橋", "飯田橋"],
                "msg": "{env}のアイテムです。"
            }
        }
    },
    {
        "PutRequest": {
            "Item": {
                "id": "G-13",
                "name": "神田",
                "line": "銀座線",
                "destinations": ["三越前", "日本橋", "京橋"],
                "msg": "{env}のアイテムです。"
            }
        }
    },
    {
        "PutRequest": {
            "Item": {
                "id": "A-15",
                "name": "東日本橋",
                "line": "都営浅草線",
                "destinations": ["人形町", "日本橋", "宝町"],
                "msg": "{env}のアイテムです。"
            }
        }
    },
    {
        "PutRequest": {
            "Item": {
                "id": "JO21",
                "name": "馬喰町",
                "line": "総武快速線",
                "destinations": ["新日本橋", "東京", "新橋"],
                "msg": "{env}のアイテムです。"
            }
        }
    },
    {
        "PutRequest": {
            "Item": {
                "id": "H-14",
                "name": "小伝馬町",
                "line": "日比谷線",
                "destinations": ["人形町", "茅場町", "八丁堀"],
                "msg": "{env}のアイテムです。"
            }
        }
    }
]

取って付けた感満載の msg というキーは、登録処理のスクリプトで {env} の部分を置換する例です。 開発や本番などの環境(env)ごとに登録する値を変更することを想定しています。

数値をValueとして登録したい場合は、「""」で括ってしまわないよう注意が必要です。

DynamoDBへ一括登録するPythonスクリプト

Pythonで登録を行います。

  1. 今回のスクリプトではテーブルの作成はしないので、予め作成しておきます。
    プライマリキー(今回なら id )だけ設定しておけば他のキーはデータの登録時に追加されます。
  2. 以下のスクリプトで一括登録します。
  • 引数
    • 環境名(コード内の replace_lists 変数に設定しているキー)
    • DynamoDBテーブル名
    • インプットファイル(前章で作成したもの)
  • 起動例: python create_dynamodb_items.py dev my_table1 sample_data.json

Boto3でbatch_write_itemを使用して登録を行います。 一度に登録できるのは25アイテムまでのようなので、25個ごとに登録をしています。 (batch_write_itemについては こちらに別の記事 がありました。)

replace_lists 変数に、インプットファイル名(sample_data.json)>置換したい文字列(env)>環境名(dev/prod) という階層で置換後の文字列を設定しています。

登録結果

このように登録されています。

今回は実行時の引数の環境名に dev を指定しているので、 スプレッドシートでは {env} にしていた部分が、 開発環境 という文字列に置換され登録されています。

おわりに

key-value型のデータベースは初めて利用しました。 アプリのパラメータの管理に使っているのですが、便利ですね。

ちなみに、一括削除したい時は こちらの記事 のスクリプトを使用しています。

参考文献