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

こんにちは、広野です。

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 リソースへのアクセスが容易にできるので、踏み台サーバ的な位置付けでの活用ができ重宝しています。

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

著者について
広野 祐司

AWS サーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリとコンテンツづくりに勤しんでいます。React で SPA を書き始めたら快適すぎて、他の言語には戻れなくなりました。サーバーレス & React 仲間を増やしたいです。AWSは好きですが、それよりもAWSすげー!って気持ちの方が強いです。
取得資格:AWS 認定は12資格、ITサービスマネージャ、ITIL v3 Expert 等
2020 - 2023 Japan AWS Top Engineer 受賞
2022 - 2023 Japan AWS Ambassador 受賞
2023 当社初代フルスタックエンジニア認定
好きなAWSサービス:AWS Amplify / AWS AppSync / Amazon Cognito / AWS Step Functions / AWS CloudFormation

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