AWS DynamoDB データ エクスポート ダウンロード

今回は、AWS DynamoDBのデータをエクスポート(ダウンロード)する方法のメモとなります。

方法は幾つかあり、形式・コスト・事前準備の必要性など異なりますが、
たまに行う方法のメモとなります。

今回はPythonスクリプト等を自作する方法は含めていません。

また、どの方法もインポートに利用するには少々出力ファイルの形式を調整する必要がある方法です。

方法1:AWSコンソールからCSV出力

少量データの内容をサッと見たい時などによくやります。

・手順

  1. AWSログイン
  2. DynamoDBで対象のテーブルを開く
  3. データ表示する
  4. アクションより結果をCSVにダウンロードする
    AWS DynamoDB data csv download

・出力例

AWS DynamoDB data csv download

・注意点メモ

  • 現在表示しているページ分しかエクスポートしてくれない
    (全データダウンロードするには、ページコマ送りして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"}}'

・出力例

AWS DynamoDB CLI data output

・注意点メモ


方法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(形式指定)

・出力例

AWS DynamoDB S3 export

AWS DynamoDB S3 export

  • 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 DynamoDB S3 export status
  • 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名"
        }
      ]
    }
    

今回のメモ内容は以上となります。

どうしてもデータが大量になると、どんなデータベースでもダウンロード等の取得が大変になると思います。
データ量・用途に応じた方法を選択することになると思います。

都内でエンジニアをやっています。 2017年に脱サラ(法人設立)しました。 仕事で調べたことや、気になったことをメモしています。
投稿を作成しました 187

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る