アプリケーション開発ポータルサイト
ServerNote.NET
Amazon.co.jpでPC関連商品タイムセール開催中!
カテゴリー【Amazon/AWS
Amazon DynamoDBメモ【2・CSVファイルからの一括データ登録】
POSTED BY
2023-12-08

Amazon DynamoDBメモ【1・AWSコマンドでの基本操作】

続きです。DBにデータ登録するのに1行1行打つのは現実的でなく、CSVファイルからインポートしたいのでやってみました。

テンプレートファイルのダウンロード

GitHubから取得します。

git clone https://github.com/aws-samples/csv-to-dynamodb.git

テンプレートファイルの編集

csv-to-dynamodb/CloudFormation/CSVToDynamo.templateを編集します。

新規のDynamoDBテーブルを作ることになるので、テーブルの定義を編集します。

23行目からあたりの、

    "Resources": {
        "DynamoDBTable":{
            "Type": "AWS::DynamoDB::Table",
            "Properties":{
                "TableName": {"Ref" : "DynamoDBTableName"},
                "BillingMode": "PAY_PER_REQUEST",
                "AttributeDefinitions":[
                    {
                        "AttributeName": "uuid",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema":[
                    {
                        "AttributeName": "uuid",
                        "KeyType": "HASH"
                    }
                ],
                "Tags":[
                    {
                        "Key": "Name",
                        "Value": {"Ref" : "DynamoDBTableName"}
                    }
                ]
            }
        },

を、自分の作成するテーブルに変更します。

    "Resources": {
        "DynamoDBTable":{
            "Type": "AWS::DynamoDB::Table",
            "Properties":{
                "TableName": {"Ref" : "DynamoDBTableName"},
                "BillingMode": "PAY_PER_REQUEST",
                "AttributeDefinitions":[
                    {
                        "AttributeName": "key",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema":[
                    {
                        "AttributeName": "key",
                        "KeyType": "HASH"
                    }
                ],
                "Tags":[
                    {
                        "Key": "Name",
                        "Value": {"Ref" : "DynamoDBTableName"}
                    }
                ]
            }
        },

保存します。

CloudFormationを開く

https://ap-northeast-1.console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks?filteringStatus=active&filteringText=&viewNested=true&hideStacks=false

スタックの作成→スタックの新規作成

テンプレートの準備完了→テンプレートファイルのアップロードを選択

ファイルの選択で、上記編集したCSVToDynamo.templateを指定して「次へ」

スタックの名前はとりあえず「CSVToDynamo」、パラメータは以下のように

BucketName:CSVファイルをアップロードするs3バケット名(新規作成になる):test338844-csvtodynamo
DynamoDBTableName:対象とするDynamoDBテーブル名(新規作成になる):testtable2
FileName:CSVファイル名:insert.csv

として「次へ」

スタックオプションはひとまずデフォルトのまま「次へ」

「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」にチェックを入れ「送信

しばらく待って、スタックがCREATE_COMPLETEになれば成功です。

S3を開く

https://s3.console.aws.amazon.com/s3/home?region=ap-northeast-1#

test338844-csvtodynamoが新規作成されているので、ここにinsert.csvをアップロードすればOK。

insert.csvを作成してs3にアップする

insert.csvの中身は

"key, "sval", "nval"
"キー1", "文字列1", "1"
"キー2", "文字列2", "2"
"キー3", "文字列3", "3"

などとして、s3に設置。

aws s3 cp insert.csv s3://test338844-csvtodynamo/

自動インサートされたか確認

aws dynamodb scan --table-name testtable
{
    "Items": [
        {
            "sval": {
                "S": "文字列2"
            },
            "key": {
                "S": "キー2"
            },
            "nval": {
                "S": "2"
            }
        },
        {
            "sval": {
                "S": "文字列1"
            },
            "key": {
                "S": "キー1"
            },
            "nval": {
                "S": "1"
            }
        },
        {
            "sval": {
                "S": "文字列3"
            },
            "key": {
                "S": "キー3"
            },
            "nval": {
                "S": "3"
            }
        }
    ],
    "Count": 3,
    "ScannedCount": 3,
    "ConsumedCapacity": null
}

インサートはされているようだが、nvalが数値でなく当然文字列になってしまっている。

一旦全部消して、

"key", "sval", "nval"
"キー1", {"S":"文字列1"}, { "N":"1" }
"キー2", {"S":"文字列2"}, { "N":"2" }
"キー3", {"S":"文字列3"}, { "N":"3" }

などとして再度アップロードしてみたが、今度は自動インサートされず反応してくれなかった。うーむ。。

と、いうより、その前にたかがCSVインサートなのにめんどくさすぎる

しかも、1テーブルにつきスタックとS3バケットを常に手動で新規作成しなくてはいけないんじゃ使い物にならない。

やりたいのは、複数テーブルの一括作成とそのそれぞれの中身の一括インサートなわけで。。

調べたところawsコマンドを使ったJSONファイル指定ならデータの一括追加ができるらしいので、次の回ではそれをやってみます↓

Amazon DynamoDBメモ【3・JSONファイルからの一括データ登録】

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

☆ServerNote.NETショッピング↓
ShoppingNote / Amazon.co.jp
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】