DynamoDBのデータをCSV出力する方法

DynamoDBのデータをCSV出力する方法を取り上げます。「管理画面からの出力方法」「AWS CLIとjqコマンドを利用した出力方法」「DynamoDBtoCSVを利用した出力方法」を確認します。

動作確認環境

動作確認環境を構築します。

まず、usersテーブル を作成します。

aws dynamodb create-table \
--table-name 'users' \
--attribute-definitions '[{ "AttributeName": "user_id", "AttributeType": "N"}, { "AttributeName": "created_at", "AttributeType": "S" }, { "AttributeName": "post_id", "AttributeType": "N" }]' \
--key-schema '[{ "AttributeName": "user_id", "KeyType": "HASH" }, { "AttributeName": "created_at", "KeyType": "RANGE" }]' \
--local-secondary-indexes '[{ "IndexName": "post_local_index", "Projection": { "ProjectionType": "ALL" }, "KeySchema": [{ "AttributeName": "user_id", "KeyType": "HASH" }, { "AttributeName": "post_id", "KeyType": "RANGE" }]}]' \
--global-secondary-indexes '[{ "IndexName": "post_global_index", "Projection": { "ProjectionType": "ALL" }, "KeySchema": [{ "AttributeName": "post_id", "KeyType": "HASH" }], "ProvisionedThroughput": { "ReadCapacityUnits": 10, "WriteCapacityUnits": 10 }}]' \
--provisioned-throughput '{"ReadCapacityUnits": 10, "WriteCapacityUnits": 10}'

usersテーブル にアイテムを挿入します。

aws dynamodb put-item --table-name users --item '{ "user_id": { "N": "1" }, "post_id": { "N": "2" }, "created_at": { "S": "1544741492" }, "message": { "M": { "title": { "S": "aaa" }, "body": { "S": "aaaaaaaaaaaaaa" } } } }'
aws dynamodb put-item --table-name users --item '{ "user_id": { "N": "2" }, "post_id": { "N": "9" }, "created_at": { "S": "1544745092" }, "message": { "M": { "title": { "S": "bbb" }, "body": { "S": "bbbbbbbbbbbbbb" } } } }'
aws dynamodb put-item --table-name users --item '{ "user_id": { "N": "3" }, "post_id": { "N": "3" }, "created_at": { "S": "1544748692" }, "message": { "M": { "title": { "S": "ccc" }, "body": { "S": "cccccccccccccc" } } } }'
aws dynamodb put-item --table-name users --item '{ "user_id": { "N": "1" }, "post_id": { "N": "5" }, "created_at": { "S": "1544752292" }, "message": { "M": { "title": { "S": "ddd" }, "body": { "S": "dddddddddddddd" } } } }'
aws dynamodb put-item --table-name users --item '{ "user_id": { "N": "5" }, "post_id": { "N": "3" }, "created_at": { "S": "1544755892" }, "message": { "M": { "title": { "S": "eee" }, "body": { "S": "eeeeeeeeeeeeee" } } } }'
677-aws-dynamodb-csv_1.png

usersテーブルにアイテムが挿入されました。

このテーブルを利用して動作確認します。

管理画面からCSV出力

以下のように、アイテムを選択した状態で CSVへエクスポート をクリックすると、選択したアイテムがCSVに出力されます。

677-aws-dynamodb-csv_2.png

出力されたCSVの中身は、以下のようになっています。

$ cat users.csv
"user_id (N)","created_at (S)","message (M)","post_id (N)"
"1","1544741492","{  ""body"" : { ""S"" : ""aaaaaaaaaaaaaa"" },  ""title"" : { ""S"" : ""aaa"" }}","2"
"1","1544752292","{  ""body"" : { ""S"" : ""dddddddddddddd"" },  ""title"" : { ""S"" : ""ddd"" }}","5"
"2","1544745092","{  ""body"" : { ""S"" : ""bbbbbbbbbbbbbb"" },  ""title"" : { ""S"" : ""bbb"" }}","9"
"3","1544748692","{  ""body"" : { ""S"" : ""cccccccccccccc"" },  ""title"" : { ""S"" : ""ccc"" }}","3"
"5","1544755892","{  ""body"" : { ""S"" : ""eeeeeeeeeeeeee"" },  ""title"" : { ""S"" : ""eee"" }}","3"

手軽ですが、画面に表示されている項目数しかエクスポートできないので、最大100項目までしかエクスポートできません。

aws cliとjqコマンドを利用してCSV出力

AWS CLIjqコマンド を利用して、CSV出力してみます。

下記コマンドを実行します。

aws dynamodb scan --table-name users \
| jq -r '.Items[] | [.user_id.N, .post_id.N, .created_at.S, .message.M.title.S, .message.M.body.S] | @csv'
$ aws dynamodb scan --table-name users \
> | jq -r '.Items[] | [.message.S, .user_id.N, .created_at.S, .post_id.N] | @csv'
"cccccccccccccc","3","1544748692","3"
"bbbbbbbbbbbbbb","2","1544745092","9"
"aaaaaaaaaaaaaa","1","1544741492","2"
"dddddddddddddd","1","1544752292","5"
"eeeeeeeeeeeeee","5","1544755892","3"

DynamoDBtoCSVを利用してCSV出力

DynamoDBtoCSV というNode.jsで書かれたツールを利用してみます。

まずはツールを利用できる状態にします。

$ git clone git@github.com:edasque/DynamoDBtoCSV.git
$ cd DynamoDBtoCSV/
$ npm install

AWSの認証情報を設定します。

$ vi config.json

テーブルを指定してCSV出力します。

$ node dynamoDBtoCSV.js --table users > output.csv

結果は以下のようになりました。

$ cat output.csv
message,user_id,created_at,post_id
"{""title"":""ccc"",""body"":""cccccccccccccc""}",3,1544748692,3
"{""title"":""bbb"",""body"":""bbbbbbbbbbbbbb""}",2,1544745092,9
"{""title"":""aaa"",""body"":""aaaaaaaaaaaaaa""}",1,1544741492,2
"{""title"":""ddd"",""body"":""dddddddddddddd""}",1,1544752292,5
"{""title"":""eee"",""body"":""eeeeeeeeeeeeee""}",5,1544755892,3