はじめに
2026 年 10 月 1 日に、Amazon DynamoDB の Amazon S3 へのエクスポートでフィルターが使えるようになりました!
これまでの S3 エクスポートは、テーブル全体か指定期間の増分を丸ごと出すしかありませんでしたが、今回のアップデートで、エクスポート時に項目と属性を絞り込めます。
「特定のデータだけ別テーブルに切り出したい」と思ったことがあり、今回のアップデートで実現できそうだったので検証してみました。
前提条件・制約
- この機能を使う場合、S3 エクスポート全般と同じく、ポイントインタイムリカバリ(PITR)の有効化が必須です。提供リージョンは AWS GovCloud(米国)を除く全リージョンです
- 2026/10/16に東京リージョンで動作確認しました
フィルター付きエクスポートとは?
この機能は名前の通り、エクスポート対象データをフィルタリングできる機能です。
フィルターはフルエクスポート(full)と増分エクスポート(incremental)のどちらでも使えます。
絞り込みには 3 種類の式があり、1 つだけでも組み合わせても指定できます。
| 式 | 役割 | 構文の出どころ | データ読み取り量への影響 |
|---|---|---|---|
| key condition expression | パーティションキー(PK)で項目を選ぶ。ソートキー(SK)の条件は任意 |
Query のキー条件式 |
減る(読み取り対象が 1 つの PK 値に限定される) |
| filter expression | キー属性・非キー属性に条件を付ける |
Scan のフィルター式 |
減らない(読み取り後に適用) |
| projection expression | 出力する属性を選ぶ | 他の操作の射影式 | - |
今回はライトに検証したので、使ったのは key condition expression だけです。
filter expression と projection expression は試していないので、上記の簡単な紹介にとどめます。
料金
フィルターを付けてもレートは通常のエクスポートと同じで、フィルタリング自体の追加料金はありません。
フルエクスポートはその時点のテーブルサイズ(テーブルデータ + LSI)、増分エクスポートは対象期間の継続バックアップから処理したデータサイズで課金されます。
key condition で単一の PK 値に絞った場合、読み取るデータが減り、マッチしたデータ分だけの課金になります(1 エクスポートあたり最小 10 MB)。
filter expression は読み取り後に適用されるので、課金は減りません。
やってみた
検証シナリオ
では、マルチテナントSaaS基盤での利用を想定し、早速触ってみます。
PK がテナント ID のプール型のテーブルに、3 テナントのデータが混在しています。
このうち tenant-a のデータだけをエクスポートし、そのデータだけで新しいテーブルを作ります。
1 テナントだけを選ぶので、key condition expression で tenantId = tenant-a を指定します。
ただ、エクスポートはあくまで S3 への出力で、元のテーブルに書き戻す(リストアする)機能ではありません。
エクスポートしたデータを使うには、別途 Import from S3 で新しいテーブルを作ります。
つまり、filtered export → S3 → Import from S3 → 新テーブルという流れです。
検証用テーブルの準備
検証用テーブル filtered-export-poc を作成しました。
PK は tenantId(String)、SK は itemId(String)、PITR を有効にしています。
以下のような3 テナント分のデータを各 2 件、計 6 件入れました。
| tenantId | itemId | name | amount | status |
|---|---|---|---|---|
| tenant-a | item-001 | Alice | 100 | active |
| tenant-a | item-002 | Bob | 250 | inactive |
| tenant-b | item-001 | Carol | 300 | active |
| tenant-b | item-002 | Dave | 420 | active |
| tenant-c | item-001 | Eve | 500 | inactive |
| tenant-c | item-002 | Frank | 640 | active |
フィルター付きエクスポートを実行する
テーブル filtered-export-poc の「Exports and streams」タブを開き、「Export to S3」をクリックします。
Export 画面に「Filter table data - optional」というセクションが増えていました。
Partition key、Sort key、Filter conditions、Attribute projections の入力欄が並んでいます。
Destination S3 bucket は s3://filtered-export-poc-<アカウントID>-apne1、Partition key は tenantId (String) に tenant-a を指定します。
Sort key は Attribute が itemId (String) に自動補完されますが、Value は未入力のまま(絞り込みなし)です。
Filter conditions は指定せず、Attribute projections は All attributes、
Export settings は Point-in-time export(Current time)、Exported file format は DynamoDB JSON、暗号化は Amazon S3 key(SSE-S3)にしました。
「Export」をクリックすると、エクスポートジョブが始まります。Status は「Exporting」になっています。
処理には5分程度かかりました。
S3 に出力された中身を確認する
エクスポート先のバケットを見ると、AWSDynamoDB/01791924196046-4c52c674/ の配下に 6 つのオブジェクトができていました。
Import from S3 で新テーブルを作る
Import from S3 は CSV、DynamoDB JSON、Amazon Ion を受け付け、インポート時に新しいテーブルを作成します。
エクスポートの出力形式(DynamoDB JSON)がそのまま Import の入力として使えるので、間に変換を挟まずに済みます。
DynamoDB コンソールの左メニューから「Imports from S3」を開きます。
「Import from S3」をクリックし、「Browse S3」でインポート元を選びます。
ここで指定するのはエクスポート先プレフィックス直下ではなく、実データが入っている data/ フォルダです。
DynamoDB のエクスポートデータファイルは .json.gz として出力されるため、Source S3 URL を s3://filtered-export-poc-<アカウントID>-apne1/AWSDynamoDB/01791924196046-4c52c674/data/ に、Import file compression を GZIP に合わせます。
Specify table details では、新テーブル名を filtered-export-poc-imported にしました。キーは元テーブルと同じく、PK tenantId(String)、SK itemId(String)です。
Default settings のまま進めて、インポートを開始します。
新テーブルの中身を確認する
インポート後、「Explore items」で filtered-export-poc-imported を Scan してみます。
結果は「Items returned: 2」で、tenant-a の 2 件だけが入っていました。
| tenantId | itemId | amount | name | status |
|---|---|---|---|---|
| tenant-a | item-001 | 100 | Alice | active |
| tenant-a | item-002 | 250 | Bob | inactive |
tenant-b と tenant-c は含まれていません。無事、1 テナント分だけ切り出せました。
まとめ
DynamoDB のフィルター付きエクスポートで、特定のテナントだけを切り出して新しいテーブルを作る流れを試してみました。
- key condition expression でパーティションキーを 1 つに絞ると、読み取るデータが減りマッチした分だけの課金になる(filter expression は読み取り後に適用されるので課金は減らない)
- エクスポートはリストアではないので、データを使うには Import from S3 で新しいテーブルを作る
- エクスポートの出力形式(DynamoDB JSON)はそのまま Import の入力に使えるので、間に変換を挟まずに済む
- Import 時に指定するのはプレフィックス直下ではなく、実データが入っている
data/フォルダ(.json.gz出力)
複数種類のデータが混在するテーブルから、移行や検査で特定のテナントだけを切り出して別テーブルに残す、といった使い方に早速使えそうだと感じました。
コスト削減にもなりそうですので、なかなか便利機能ですねー








