はじめに
DynamoDBでテーブルをまるっと取得するってなかなか難しくないですか?
作成された順にitem(RDBでいうレコードみたいなもの)を全件並べて解析したい!みたいなことも難しい🤔
一回のScanで取得できるデータが最大1MBという制約がなかなか厄介で、
DynamoDB コンソール上からは簡単に全件データのエクスポートができないようになっています。
ページごとの表示数をMAXの300件にしても、全件を取得するために「次のページを取得」を連打して、CSVをエクスポートする必要がありました。
どうにか簡単にできる方法はないか色々調べてたところ、
以下の方法でコマンド一発でテーブルの内容をまるっとにCSVにエクスポートできるようになりました。
一括でCSVへ出力する方法
前提条件
- AWS Config にAccessKeyやらのprofileを設定しておく
- AWS CLI を使用できるようにしておく
手順
- jqコマンドを使用するのでインストールする
(Mac環境なのでbrewでインストールしてます🍎 ) - AWS CLI と jqコマンドを組み合わせたコマンドを発行する
# jqコマンドをインストール
$ brew install jq
# インストールされたことを確認
$ jq --version
jq-1.6
# 全件取得とCSV出力のコマンド発行
$ aws dynamodb scan --table-name HogeTable --profile hoge-profile | jq -r '["ID","ユーザー名","作成日"], (.Items[] | [.ID.N, .Name.S, .createdAt.S]) | @csv' > sample.csv
コマンド詳細
AWS CLIでDynamoDBから値をJSONで取得
aws dynamodb scan --table-name HogeTable --profile hoge-profile
このコマンドで、DynamoDBの指定したテーブル内容をJSON形式で取得しています。
HogeTable
を対象のテーブル名、hoge-profile
を~/.aws/config
に設定しているprofileにしてください。
**なんか上手くいかない!**という場合はまずこのコマンドでJSONを取得できているか確認してみてください。
jqコマンドでJSONをCSVに整形
jq -r '["ID","ユーザー名","作成日"], (.Items[] | [.ID.N, .Name.S, .createdAt.S]) | @csv'
ここの箇所でJSONをCSV形式に整形しています。
jq -r 'ヘッダー, (項目) | @csv'
というイメージです。
aws dynamodb scan ~
コマンドで取得されるJSONは以下のような形式かと思うので、それにあわせて項目の部分を設定します。
# aws dynamodb scan ~で取得できるJSON例
{
"Items": [
{
"ID": {
"N": "1"
},
"Name": {
"S": "清水真太郎"
},
"createdAt": {
"S": "2021-09-13T02:33:07.443Z"
}
},
{
"ID": {
"N": "2"
},
"Name": {
"S": "柴田大知"
},
"createdAt": {
"S": "2021-09-13T02:37:27.542Z"
}
}
]
}
整形されたCSVデータをCSVファイルに出力
> sample.csv
最後にCSVデータをCSVファイルとして出力させています。
まとめ
DynamoDBのテーブルに合わせてコマンドを作成するのに最初やや時間がかかりますが、
一度作成してしまえばいつでもすぐ全件をCSVにエクスポートできるようになりました!😇
DynamoDBのTipsあればぜひ教えてください!