今回は、AWS DynamoDBのデータをエクスポート(ダウンロード)する方法のメモとなります。
方法は幾つかあり、形式・コスト・事前準備の必要性など異なりますが、
たまに行う方法のメモとなります。
今回はPythonスクリプト等を自作する方法は含めていません。
また、どの方法もインポートに利用するには少々出力ファイルの形式を調整する必要がある方法です。
目次
方法1:AWSコンソールからCSV出力
少量データの内容をサッと見たい時などによくやります。
・手順
・出力例
・注意点メモ
- 現在表示しているページ分しかエクスポートしてくれない
(全データダウンロードするには、ページコマ送りして1ページずつダウンロードが必要) - コンソール表示に制限あり(最大1MB)
- データ表示にデフォルトでScan実行されるため、
大量データテーブルの場合表示の時点でコストが割高。 - AWSコンソールにログイン、DynamoDB画面を開くための権限等は必要
方法2:AWS CLIでJSON出力
こちらも方法1とほぼ変わらず、AWSログインが手間で少量データの内容をサッと見たい時などに。
# テーブル全体をスキャンしてJSON出力
aws dynamodb scan --table-name 対象DynamoDB名 --output json > export.json
# パーティションキーを指定して取得
aws dynamodb query --table-name 対象DynamoDB名 --key-condition-expression "id = :uid" --expression-attribute-values '{":uid":{"N":"123"}}'
・出力例
・注意点メモ
- デフォルトデータ量制限がある(1MB)
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html - 方法1と同じで制限に引っかかる場合、ページネーションして取得が必要
- Scan実行等、読み込み量が多いとコストが割高。
データ量が多い場合パフォーマンスに影響する可能性が有ります。
並列度を下げて実行や、負荷が低い時間帯に実行するなど調整すればマシになるかもですが微妙。 - queryは、インデックスが必要などテーブル設定次第では実行できない。
- AWS CLI実行権限、DynamoDB操作権限等が必要
方法3:ポイントインタイムリカバリ(PITR)
Export to S3
大量データや本格的にエクスポートを考える時にやっている方法です。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/S3DataExport.HowItWorks.html
# エクスポート実行
aws dynamodb export-table-to-point-in-time \
--table-arn エクスポート対象DynamoDB ARN \
--s3-bucket 出力先S3バケット名 \
--s3-prefix フォルダ名/ \
--export-format DYNAMODB_JSON(形式指定)
・出力例
- manifest-summary.json:エクスポートしたデータ内容等が記載されています。
- manifest-files.json:各ファイルの詳細が記載されています。
- data/:エクスポートされた実際のテーブルデータJSONが配置されています。
・注意点メモ
- ポイントインタイムリカバリ(PITR)有効化が必要。PITRもコストは発生(結果的にScan等よりは割安になるはず)。
# PITRを有効化(まだの場合) aws dynamodb update-continuous-backups \ --table-name ターゲットDynamoDBテーブル名 \ --point-in-time-recovery-specification PointInTimeRecoveryEnabled=true - S3バケットが必要。実行ユーザーに、S3バケットに対してエクスポートできる権限設定も必要。
- 時間がかかる。少量データでもそれなりにかかる印象です。
コマンドやDynamoDB エクスポートおよびストリームタブでステータスを確認できます。

- AWS CLI実行、DynamoDB、S3操作権限が実行ユーザーに必要
# ポリシー例 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:ExportTableToPointInTime", "dynamodb:DescribeExport", "dynamodb:DescribeContinuousBackups", "dynamodb:DescribeTable" ], "Resource": [ "対象DynamoDBテーブル ARN:table/テーブル名", "対象DynamoDBテーブル ARN:table/テーブル名/export/*" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:AbortMultipartUpload" ], "Resource": "arn:aws:s3:::ターゲットS3名/*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::ターゲットS3名" } ] }
今回のメモ内容は以上となります。
どうしてもデータが大量になると、どんなデータベースでもダウンロード等の取得が大変になると思います。
データ量・用途に応じた方法を選択することになると思います。




