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" } } } }'
usersテーブルにアイテムが挿入されました。
このテーブルを利用して動作確認します。
管理画面からCSV出力
以下のように、アイテムを選択した状態で CSVへエクスポート
をクリックすると、選択したアイテムがCSVに出力されます。
出力された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 CLI と jqコマンド を利用して、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"
jqコマンド(jsonデータの加工, 整形)の使い方
jqコマンドは、JSONデータから目的の情報を抽出するのに便利な機能を提供しています。ここでは、jqコマンドの基本的な利用方法を確認します。
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