こんにちは、広野です。
Amazon DynamoDB テーブルを作成した後、AWS ネイティブなデータインポート機能が無いために困った経験はお有りでしょうか。
私はそうでした。データさえあれば後は入れるだけ、という風にしたくて、そんなスクリプトを作ったので紹介します。
やりたいこと
- Amazon DynamoDB テーブルにデータをインポートしたい。
- データインポート手段はスクリプトとする。ここでは、Python を使用する。
- インポートしたいデータは JSON 形式とする。
- スクリプトを実行する環境は AWS Cloud9 を使用する。
サンプルデータ
Amazon DynamoDB テーブル
以下の Amazon DynamoDB テーブルにデータを入れたいと思います。
menu パーティションキー 文字列 |
id ソートキー 数値 |
neta |
menu1 | 1 | いか |
menu1 | 2 | たこ |
menu2 | 1 | 海鮮丼 |
インポート用データ (JSON)
上記のデータを JSON 形式にすると、以下のようになります。
[ { "menu": "menu1", "id": 1, "neta": "いか" }, { "menu": "menu1", "id": 2, "neta": "たこ" }, { "menu": "menu2", "id": 1, "neta": "海鮮丼" } ]
データを Excel や CSV で作成した場合、ネット上のツール等を利用して JSON に変換することができます。セキュリティ上不安な場合は EXCEL/CSV データを JSON に変換するスクリプトを自分で書きましょう。
JSON ファイルの文字コードは UTF-8N で保存しましょう。UTF-8 ですと、AWS Cloud9 や AWS Lambda 等でファイルを扱うときにエラーになります。エディタを使うときは要注意です。
サンプルスクリプト (Python)
ここでは、以下のスクリプトを import.py というファイル名で保存します。スクリプトファイルの文字コードも UTF-8N にしないと AWS Cloud9 で実行する際にエラーになります。
import boto3 import json import decimal if __name__=='__main__': dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-1') #リージョン名を指定 table = dynamodb.Table('menutable') # DynamoDBテーブル名を指定 with open("data.json") as json_file: # データファイル名を指定、ここではスクリプトと同じディレクトリにある想定 data = json.load(json_file, parse_float = decimal.Decimal) with table.batch_writer() as batch: for row in data: menu = row['menu'] id = int(row['id']) # 数値データは一旦文字列になってしまうため、数値に変換 neta = row['neta'] print("Adding data:", id) batch.put_item( Item={ 'menu': menu, 'id': id, 'neta': neta } )
AWS Cloud9 実行環境
AWS Cloud9 は AWS マネジメントコンソールから操作可能な EC2 ベースの Linux サーバで、最初から各種開発に必要なツールがインストールされた状態で立ち上がります。立ち上げた EC2 インスタンスは AWS マネジメントコンソールにログインした IAM ユーザの権限を引き継ぐため、本記事ではその IAM ユーザが Amazon DynamoDB への書き込み権限を持っていることが前提となっています。
立ち上げた AWS Cloud9 のコンソールで、以下のコマンドを実行しておきましょう。
pip3 install boto3
スクリプトとデータファイルを同じディレクトリに配置し、以下のようにコマンドを打ってインポートを実行します。
python3 import.py
まとめ
いかがでしたでしょうか?
Amazon DynamoDB へのデータインポートは機会が多いと思いまして紹介しました。本記事では AWS Cloud9 を使用した例にしましたが、AWS Cloud9 は AWS CLI などコマンドベースでの AWS リソースへのアクセスが容易にできるので、踏み台サーバ的な位置付けでの活用ができ重宝しています。
本記事がみなさまのお役に立てれば幸いです。