背景・目的
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の準備
テーブルの作成
- 下記の内容を入力し、「テーブルの作成」ボタンをクリックします。
PITRの有効化
S3の作成
- S3バケットを作成します。
データの準備
Incremental Export (New only)
-
S3バケットを指定して、エクスポートを設定します。
- エクスポート期間を、最後の30min
- JSONフォーマット
- 新しいイメージのみ
- 暗号化キータイプは、SSE-S3
-
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もあらためて確認
-
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)
-
データを更新・追加・削除します。
- id1を削除
- id2のvalueをtest200からtest2に変更
- id4を追加
-
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のみで出力した場合の挙動を確認してみます。
-
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回目(更新されないデータは出力されるのか確認)
上記から変更せずに、エクスポート期間を短縮しエクスポートし、どのようなデータが出力されるか確認します。
-
やはり出力されていないようです。
$ 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上での差分更新などを効率よく行えそうです。
参考