LoginSignup
0
0

DynamoDB の S3への増分エクスポートを試してみた

Last updated at Posted at 2023-09-27

背景・目的

AWSが2023年9月26日にAmazon DynamoDB(DDB)からAmazon S3(S3)へのインクリメンタルエクスポート機能を発表いたしました。この新機能により、どのようにデータ管理が変わるか、実際に手を動かしながら基本的な挙動を確認してみます。

まとめ

  • AWSの増分エクスポート機能により、挿入、更新、または削除されたデータを少量ずつエクスポートでき、数メガバイトからテラバイトのデータ範囲に対応しています。
  • ポイントインタイムリカバリが有効なDDBテーブルが対象です。
  • 指定した期間の増分データをS3バケットにエクスポートします。
  • この機能はフルマネージドであり、DDBの容量を消費せず、定期的なデータ更新が容易になります。
  • サポートされているデータ形式はDynamoDB JSONとAmazon Ionです。
  • これにより、テーブル全体を毎回エクスポートする必要がなく、変更データのみを効率的にダウンストリームデータレイクや分析ターゲットに送ることができます。

概要

Announcing incremental export to S3 for Amazon DynamoDBを元に概要を整理します。

本日、Amazon DynamoDB は、指定された時間間隔内に変更されたデータのみをエクスポートできる S3 への増分エクスポートの一般提供を発表しました。増分エクスポートを使用すると、挿入、更新、または削除されたデータを少しずつエクスポートできるようになりました。AWS マネジメントコンソール、API 呼び出し、または AWS コマンドラインインターフェイスで数回クリックするだけで、数メガバイトからテラバイトの範囲で変更されたデータをエクスポートできます。ポイントインタイムリカバリが有効になっている DynamoDB テーブルを選択し、増分データが必要なエクスポート期間を指定し、ターゲットの Amazon S3 バケットを選択して、エクスポートします。

増分エクスポートを使用すると、テーブル全体のエクスポートを毎回実行することなく、変更データ キャプチャ パイプラインをセットアップしてダウンストリーム データ レイクまたは分析ターゲットを定期的に更新できます。S3 への増分エクスポートはフルマネージド機能であり、DynamoDB テーブルの容量を消費しません。サポートされているデータ形式は、DynamoDB JSON と Amazon Ion です。増分エクスポートは、すべての AWS 商用リージョンと GovCloud で利用できます。

  • AWSの増分エクスポート機能はDDBからS3へのデータエクスポートを効率化。
  • 挿入、更新、削除されたデータを少量ずつエクスポートする。
  • データ範囲は数メガバイトからテラバイトまで対応。
  • 操作はマネコン、API、CLIから実行可能
  • ポイントインタイムリカバリ(PITR)が有効なDynamoDBテーブルで、指定期間の増分データをS3にエクスポート可能。
  • フルマネージドサービスで、DynamoDBの容量は消費されない。
  • 定期的なデータ更新が容易になる
  • サポートされるデータ形式はDynamoDB JSONとAmazon Ion。
  • テーブル全体をエクスポートする必要がなく、変更データのみをダウンストリームデータレイクや分析ターゲットに送れる。
  • すべてのAWSリージョンで利用可能

機能

Introducing incremental export from Amazon DynamoDB to Amazon S3を元に整理します。

  • Incremental Exportでは、下記が選択可能です。
    • 期間
    • 出力イメージ:「New only」または「New and Old」
    • Encryption:「S3-SSE」、「SSE-KMS」

実践

下記について試してみます。

  • Incremental Exportでタイムウインドウを変更した際の比較
  • Incremental Exportの「New only」と「New and old」の比較

なお、本検証は、こちらのドキュメントを参考に進めていきます。

事前準備

DDBの準備

テーブルの作成

  1. 下記の内容を入力し、「テーブルの作成」ボタンをクリックします。
    • テーブル名:ddb_incremental_export_table(任意)
    • パーティションキー:id(任意)
    • キャパシティ:オンデマンド
      image.png
      image.png
      image.png
      image.png

PITRの有効化

  1. 作成したテーブルで、①「バックアップ」タブ、②「編集」をクリックします。
    image.png

  2. 「ポイントタイムリカバリの有効化」をチェックし、「変更を保存」をクリックします。
    image.png

S3の作成

  1. S3バケットを作成します。

データの準備

  1. 下記のデータを新規に登録します。

    id value
    ===
    1 test1
    2 test200
    

    image.png

Incremental Export (New only)

  1. S3へのエクスポートを選択します。
    image.png

  2. S3バケットを指定して、エクスポートを設定します。

    • エクスポート期間を、最後の30min
    • JSONフォーマット
    • 新しいイメージのみ
    • 暗号化キータイプは、SSE-S3

    image.png

  3. 出力されました。下記のうち、20.0B以外の2つのファイルを確認します。
    image.png

  4. NewImagesの属性に更新後のデータのみ含まれていることがわかりました。

    $ ls -l *json
    -rw-r--r--  1 XXX  XXX  139  9 27 09:21 4kkyzi6ibqzw3loswrastf2g7u.json
    -rw-r--r--  1 XXX  XXX  137  9 27 09:21 e2uc3uj2kuygnkitwuz3iueo7e.json
    $ cat *json
    {"Metadata":{"WriteTimestampMicros":{"N":"1695772297480792"}},"Keys":{"id":{"N":"2"}},"NewImage":{"id":{"N":"2"},"value":{"S":"test200"}}}
    {"Metadata":{"WriteTimestampMicros":{"N":"1695772182799033"}},"Keys":{"id":{"N":"1"}},"NewImage":{"id":{"N":"1"},"value":{"S":"test1"}}}
    $ 
    

補足:Full Exportもあらためて確認

  1. フルエクスポートも試してみます。
    image.png

  2. 出力されました。下記のうち、20.0B以外の2つのファイルを確認します。
    image.png

  3. Full Exportの場合は、想定通り最後のデータが出力されています。

    $ ls *json
    h5vnx46qoe23xjz6227jvau6ii.json	rb3bvaj7vu2ptkbglxzmiy2lli.json
    $ cat *json
    {"Item":{"id":{"N":"2"},"value":{"S":"test200"}}}
    {"Item":{"id":{"N":"1"},"value":{"S":"test1"}}}
    $ 
    

Incremental Export (New and old)

  1. データを更新・追加・削除します。

    • id1を削除
    • id2のvalueをtest200からtest2に変更
    • id4を追加

    image.png

  2. 新旧イメージでエクスポートします。
    image.png

  3. 出力されました。下記のうち、20.0B以外の2つのファイルを確認します。
    image.png

  4. NewImageとOldImageの属性が出力されました。下記の確認ができました。

    • 削除したid1については、OldImageのみ
    • 変更したid2については、OldImageとNewImage
    • 追加したid4については、NewImageのみ
    $ cat *json
    {"Metadata":{"WriteTimestampMicros":{"N":"1695775410591400"}},"Keys":{"id":{"N":"1"}},"OldImage":{"id":{"N":"1"},"value":{"S":"test1"}}}
    {"Metadata":{"WriteTimestampMicros":{"N":"1695775397956928"}},"Keys":{"id":{"N":"2"}},"OldImage":{"id":{"N":"2"},"value":{"S":"test200"}},"NewImage":{"id":{"N":"2"},"value":{"S":"test2"}}}
    {"Metadata":{"WriteTimestampMicros":{"N":"1695775321187562"}},"Keys":{"id":{"N":"4"}},"NewImage":{"id":{"N":"4"},"value":{"S":"test4"}}}
    $
    

Incremental Export (New) 2回目

上記の状態でNewのみで出力した場合の挙動を確認してみます。

  1. 新しいイメージのみを選択し、「エクスポート」を選択します。
    image.png

  2. 出力されました。下記のうち、20.0B以外の2つのファイルを確認します。
    image.png

  3. id2とid4以外にも、id1の値が出力されています。

    $ ls *json
    7wm5lpcvzu3khph4usyxbnybdy.json	dvixszpzsu2tpjzoogjevvt3ii.json
    $ cat *json
    {"Metadata":{"WriteTimestampMicros":{"N":"1695775410591400"}},"Keys":{"id":{"N":"1"}}}
    {"Metadata":{"WriteTimestampMicros":{"N":"1695775397956928"}},"Keys":{"id":{"N":"2"}},"NewImage":{"id":{"N":"2"},"value":{"S":"test2"}}}
    {"Metadata":{"WriteTimestampMicros":{"N":"1695775321187562"}},"Keys":{"id":{"N":"4"}},"NewImage":{"id":{"N":"4"},"value":{"S":"test4"}}}
    $ 
    

こちらのブログの記事でいうところの、id1はKeysのみ表示されているようです。

※出典:Introducing incremental export from Amazon DynamoDB to Amazon S3

Incremental Export (New) 3回目(更新されないデータは出力されるのか確認)

上記から変更せずに、エクスポート期間を短縮しエクスポートし、どのようなデータが出力されるか確認します。

  1. 期間を15min(この期間に更新はしていない。)に変更し、新しいイメージのみを選択し、「エクスポート」を選択します。
    image.png

  2. 出力されました。20.0Bのファイルしかないようです。念のため内容を確認してみます。
    image.png

  3. やはり出力されていないようです。

    $ ls *json
    3dqevhuv2m2mpa2zm3b63izloq.json	evskgte45m6q5du3b7kbh5imci.json	sars3z627i2xdgkwj62y6rv6yq.json	ztjtq4vwwe65jnhmgh6ypyheoe.json
    $ cat *json
    $
    

考察

  • 更新・削除・追加のステータスを確認するには、「New Image Only」の場合、下記のように確認すればよさそうです。
    • New Imageがある場合、InsertかUpdateされていること
    • New Imageがない場合、Deleteされていること
  • Incremental Exportを利用すれば、DDBからS3上での差分更新などを効率よく行えそうです。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0