概要
タイトルの通りですが、コマンド一発叩いてDynamoDBを全件BOM付きでCSV出力する方法を解説します。AWS console上からだと最大300件、あとはポチポチ次のページを読み込んだりとしますがスマートじゃないですし膨大なデータになればそんなことはしてられませんのでコマンド一発叩いてパッと終わらせましょう!
対象の読者
AWSアカウントの管理にSSOを使用している方
→ aws sso login --profile ~~~を叩いたことのある方
先にコマンドだけ
printf '\xEF\xBB\xBF' > output.csv && aws dynamodb scan --table-name {{ テーブル名 }} --profile {{ プロファイル名 }} | jq -r '["Header1","Header2","Header3"], (.Items[] | [.Header1.N, .Header2.S, .Header3.S]) | @csv' >> output.csv
流れ
- 対象のDynamoDBがあるAWSアカウントのProfileを作成します
- AWS consoleから対象のDynamoDBのテーブル名を取得しておきます
- AWS consoleから対象のDynamoDBのヘッダーを取得しておきます
- 上記で取得した情報をコマンドに代入していきます
- BOMを付けるコマンドを追加して叩いて完了!
始める前に
今回はjqというツールを使いますので各OSに合わせた方法でインストールしましょう
インストール済みか確認
jq --version
MacOS:
brew install jq
Linux:
sudo apt-get install jq
Windows:
jq公式サイトからバイナリをダウンロードし、パスを通します。
1. 対象のAWSアカウントのProfileを作成
aws configure sso
いろいろ聞かれますが、AWS access portalから対象のAWSアカウントの「アクセスキー」をクリックすると必要な情報が一通り載っていますので設定していきます。
2. 対象のDynamoDBのテーブル名を取得
CSV出力したいDynamoDBのテーブル名をを控えておきます
3. 対象のDynamoDBのヘッダーを取得
AWS consoleから対象のDynamoDBのヘッダーを取得しておきます
4. コマンドに代入していきます
コマンド
aws dynamodb scan --table-name {{ テーブル名 }} --profile {{ プロファイル名 }} | jq -r '["Header1","Header2","Header3"], (.Items[] | [.Header1.N, .Header2.S, .Header3.S]) | @csv' >> output.csv
例
aws dynamodb scan --table-name Hoge-Table --profile hoge-dev | jq -r '["id","name","created_at"], (.Items[] | [.id.N, .name.S, .created_at.S]) | @csv' >> output.csv
代入時の注意点
-
(.Items[] | [.id.N, .name.S, .created_at.S])の部分の記述の.Sや.Nはデータの型を正しく指定しないと値が取れないので自分のデータに合わせて調整しましょう!(String,Number) - 出力後にCSVファイルをRenameしたくない場合は
output.csvも調整しましょう!
5. BOMをつけよう
1. BOM付きCSVファイルの生成
以下のコマンドを使用して、CSVファイルにBOMを追加します。
printf '\xEF\xBB\xBF' > output.csv && aws dynamodb scan --table-name {{ テーブル名 }} --profile {{ プロファイル名 }} | jq -r '["Header1","Header2","Header3"], (.Items[] | [.Header1.N, .Header2.S, .Header3.S]) | @csv' >> output.csv
2. コマンドの解説
BOMの追加:
printf '\xEF\xBB\xBF' > output.csv
BOMを表すバイト列(\xEF\xBB\xBF)を出力先ファイルに最初に追加。
aws dynamodb scan --table-name {{ テーブル名 }} --profile {{ プロファイル名 }} | jq -r '["Header1","Header2","Header3"], (.Items[] | [.Header1.N, .Header2.S, .Header3.S]) | @csv' >> output.csv
上記の工程で作成したコマンドを後半に代入
完成したコマンド
それぞれ取得したいデータやユーザーなどで異なる可変の位置に関しては{{ }}で囲んであります。(使用する場合{{ }}は削除の上、置き換えて下さい)
printf '\xEF\xBB\xBF' > {{ output.csv }} && aws dynamodb scan --table-name {{ テーブル名 }} --profile {{ プロファイル名 }} | jq -r '["{{ Header1 }}","{{ Header2 }}","{{ Header3 }}"], (.Items[] | [{{ .Header1.N }}, {{ .Header2.S }}, {{ .Header3.S }}]) | @csv' >> {{ output.csv }}
例
printf '\xEF\xBB\xBF' > output.csv && aws dynamodb scan --table-name Hoge-Table --profile hoge-dev | jq -r '["id","name","created_at"], (.Items[] | [.id.N, .name.S, .created_at.S]) | @csv' >> output.csv
まとめ
一度やってみると、それ以降のDynamoDBを使用したプロジェクトで簡単にCSV出力できるようになるので、試してみることをお勧めします!
それでは最後までありがとうございました!失礼します!🙇♂️