AWS運用において「DynamoDBの中身をサクッとCSVで出力してほしい」と頼まれることはありませんか?マネジメントコンソールからエクスポートするのも手ですが、特定の条件でクエリをかけ、必要な項目だけを抽出するにはCLIとjqの組み合わせが最強です。

この記事では、AWS CLIでDynamoDBからデータを取得し、軽量なJSONプロセッサjqを使って綺麗なCSVファイルに変換する方法を実用的な例とともに解説します。

1. 使用するツールの紹介

まずは、今回使用するメインツールについて簡単におさらいしましょう。

DynamoDBとは:

Amazon DynamoDBは、AWSが提供するフルマネージドのNoSQLデータベースサービスです。

一般的なデータベース(MySQLやPostgreSQLなど)との大きな違いは、「どれだけデータが増えても、レスポンス速度がほとんど変わらない」という点にあります。

  • サーバー管理が不要(サーバーレス): 面倒なプロビジョニングやパッチ当て、容量設計を気にする必要がありません。
  • 圧倒的なパフォーマンス: 1桁ミリ秒単位の低レイテンシを実現しており、大規模なWebアプリやゲームのバックエンドに最適です。
  • 柔軟なデータ構造: 厳格なスキーマ(テーブル定義)を事前に決めなくても、データ(アイテム)ごとに異なる属性を持たせることができます。

jqとは:

jqは、軽量かつ柔軟なコマンドライン形式のJSONプロセッサです。

AWS CLIが返すデータは巨大なJSON形式であることが多いため、そのままでは人間が読むのも、Excelで扱うのも大変です。jqを使えば、「特定の項目だけを抜き出す」「データの形を整える」「CSVに変換する」といった操作が、フィルタを通すような感覚で瞬時に行えます。

2. 実践!DynamoDBからクエリ取得してCSV化するコマンド

以下のコマンドは、「注文管理システム」を例にしたサンプルです。特定のユーザーID(user_id)に紐づく注文履歴を取得し、CSVとして保存します。

Bash
aws dynamodb query 
  --table-name OrderHistoryTable 
  --index-name "user-index" 
  --key-condition-expression "user_id = :v_user_id" 
  --expression-attribute-values '{":v_user_id":{"S":"USER-999888777"}}' 
  --profile my-aws-profile | 
  jq -r '.Items[] | [
  .order_id.S,
  .status.S,
  .item_name.S,
  .price.N,
  .quantity.N,
  .shipping_address.S,
  .order_date.S,
  .delivery_status.S,
  .customer_email.S,
  .updated_at.S
] | @csv' > order_export.csv

コマンドの解説

aws dynamodb query:  指定した条件に合致するデータを検索します。scanよりも効率的でコストを抑えられます。

--index-name:  グローバルセカンダリインデックス(GSI)など、パーティションキー以外で検索したい場合に指定します。

--expression-attribute-values:  検索条件の値を定義します。DynamoDB特有の型指定(Sは文字列、Nは数値)が必要です。

jq -r '.Items[] | [...] | @csv':

.Items[]:  配列の中身を1つずつ取り出します。

[...]:  CSVの列(カラム)にしたい項目を並べます。

@csv:  指定した配列をCSVフォーマットに変換します。

-r:  raw-outputオプションで、出力をクォートで囲まずに出力します。

3. jqを使う際のポイントと注意点

型の指定に注意

DynamoDBのJSONレスポンスは、.fieldName.S(文字列)や.fieldName.N(数値)のように、データ型のキーが1層深く入っています。jqで抽出する際は、この型指定を忘れないようにしましょう。

ヘッダーを追加したい場合

上記のコマンドではデータ行のみが出力されます。ヘッダーが必要な場合は、以下のようにあらかじめ書き込んでおくと親切です。

Bash
echo "OrderID,Status,ItemName,Price,Qty,Address,Date,ShipStatus,Email,UpdateDate" > order_export.csv

# この後にコマンドを実行(「>>」で追記モードにするのがポイント)
aws dynamodb query ... >> order_export.csv

まとめ

AWS CLIとjqを組み合わせることで、複雑なスクリプトを書かなくても、コマンド一行でデータの抽出・加工が可能になります。

特に、一時的なデータ確認やレポート作成において、この手法は非常に強力です。ぜひ皆さんの開発現場でも活用してみてください!

最後まで読んでいただきありがとうございました。 この記事が、皆さんのAWS運用を少しでも楽にする参考になれば幸いです。

参考リンク