DynamoDBのデータをエクスポートしてCSVに変換

エクスポートはData Pipelineを利用してS3の指定したバケットに。
データは行ごとにJSONで出力されるのでこれをテキトーにRubyでCSVに変換する。

DynamoDBのエクスポート

基本的にはドキュメント通りにやればあっけなく終わる。

エクスポートの際の疑問点や若干ハマったこと

AWS Data PipelineのIAMロール作成の際の疑問点

日本語ドキュメントを読んでいたら以下のように書いてあった。

以前に AWS Data Pipeline コンソールを使用してパイプラインを作成した場合、DataPipelineDefaultRole と DataPipelineDefaultResourceRole はその時点で自動的に作成されています。これ以上の操作は必要ありません。

自動的に作成されるならそもそも手動で作る必要ないのでは?と思いしばし手が止まった。
英文の方を見てみると「前に作ったものを再利用できます」的なニュアンスだったので翻訳の表現がちょっと良くないようだ。

そんなわけでドキュメントの指示通りに手動でサクッと作った。

リージョン間違い

テーブルがないと言うエラーが出るのでなんで?と思ったらリージョン間違ってました。リージョンは正しく指定しよう。

参考: AWS DataPipeline says DynamoDB Table not found

DynamoDB read throughput ratioとは?

よく分からないがデフォルトが0.25で最大1となっている。
なんとなく0.5にしてみたがどれだけ影響があったのかどうか分からない。

5万件くらいのデータを約10分でエクスポート完了していたので毎分1万件、毎秒166件か。
Readキャパシティ5だからだいぶ超過している気がするがこのあたりどうなっているのか。

まあとりあえずデータ件数がよほど膨大でない限りはあまり気にする必要っぽいか。

2019-05-08追記

後日同じデータを同じ設定でエクスポートしたら25分かかった。ちょっと謎。

早く終えたい場合EMRのスペックを盛ればいいのかな?
どこでどれだけ時間がかかっているのかいまいち分からない。

CSVへの変換

エクスポートされたデータをS3から落としてきてRubyでCSVに変換。ファイル名はdynamodb.dataにリネームしてから。

require "json"
require "csv"

File.open("dynamodb.data") do |f|
  CSV.open("dynamodb.csv", "w", :force_quotes => true) do |csv|
    csv << ["id", "name", "email", "created_at"]
    f.each_line do |l|
      user = JSON.parse(l)
      # USTからJSTへの変換
      date_ust = DateTime.parse(user["created_at"]["s"])
      date_jst = Time.at(date_ust.to_time.to_i).to_datetime
      csv << [
        user["id"]["s"],
        user["name"]["s"],
        user["email"]["s"],
        date_jst.to_s,
      ]
    end
  end
end