こんにちは、広野です。
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 リソースへのアクセスが容易にできるので、踏み台サーバ的な位置付けでの活用ができ重宝しています。
本記事がみなさまのお役に立てれば幸いです。
