とりあえず Amazon DynamoDB にデータをインポートしたい [AWS Cloud9 使用]

こんにちは、広野です。

Amazon DynamoDB テーブルを作成した後、AWS ネイティブなデータインポート機能が無いために困った経験はお有りでしょうか。

私はそうでした。データさえあれば後は入れるだけ、という風にしたくて、そんなスクリプトを作ったので紹介します。

やりたいこと

  • Amazon DynamoDB テーブルにデータをインポートしたい。
  • データインポート手段はスクリプトとする。ここでは、Python を使用する。
  • インポートしたいデータは JSON 形式とする。
  • スクリプトを実行する環境は AWS Cloud9 を使用する。

サンプルデータ

Amazon DynamoDB テーブル

以下の Amazon DynamoDB テーブルにデータを入れたいと思います。

menu
パーティションキー
文字列
no
ソートキー
数値
neta
menu1 1 いか
menu1 2 たこ
menu2 1 海鮮丼

インポート用データ (JSON)

上記のデータを JSON 形式にすると、以下のようになります。

[
  {
    "menu": "menu1",
    "no": 1,
    "neta": "いか"
  },
  {
    "menu": "menu1",
    "no": 2,
    "neta": "たこ"
  },
  {
    "menu": "menu2",
    "no": 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('dynamodbtest-table')  # 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']
        no = int(row['no'])  # 数値データは一旦文字列になってしまうため、数値に変換
        neta = row['neta']

        print("Adding data:", no)

        batch.put_item(
          Item={
            'menu': menu,
            'no': no,
            '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 リソースへのアクセスが容易にできるので、踏み台サーバ的な位置付けでの活用ができ重宝しています。

本記事がみなさまのお役に立てれば幸いです。

著者について
広野 祐司

AWSサーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリや教育コンテンツをつくっています。
ReactでSPAを書き始めたら快適すぎて、他の開発言語には戻れなくなりました。React仲間を増やしたいです。
取得資格:AWS認定は7つ、ITサービスマネージャ、ITIL v3 Expert、等
2019, 2020 AWS APN Top engineers 受賞
好きなAWSサービス:AWS Amplify / Amazon Cognito / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする
クラウドに強いによるエンジニアブログです。
SCSKは専門性と豊富な実績を活かしたクラウドサービス USiZE(ユーサイズ)を提供しています。
USiZEサービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。
AWSサーバレスアーキテクチャデータベース
TechHarmony
タイトルとURLをコピーしました