AWS CLI での DynamoDB Scan

aws dynamodb scan は自動でページ送りします。便利ですが、被害を判断するために使うはずのただ 1 つの数字が既定で誤っている、ということでもあります。この操作をそもそも避けるべき場面は Query と Scan の比較を参照してください。

コード

aws dynamodb scan \
  --table-name 'Music' \
  --filter-expression '#filter0 >= :filterValue0' \
  --expression-attribute-names '{"#filter0":"Year"}' \
  --expression-attribute-values '{":filterValue0":{"N":"2010"}}'

--return-consumed-capacity はスキャンではなく 1 ページ分を報告する

用意したデータは約 3.9 KB の曲 600 件で、そのうち一致するのは 8 件です。上のコマンドに --return-consumed-capacity TOTAL を足すと、CLI はこう出力します。

{ "Count": 8, "ScannedCount": 600, "CU": 128.5 }

このスキャンが実際に要したのは 3 ページにわたる 284.5 読み取りユニットです。CountScannedCount は 3 ページ分が合計された一方、ConsumedCapacity は 1 ページ目のものが取られ、残りは捨てられました。これはバグというより宣言されたルールです。botocore の DynamoDB ページネータ設定は、CountScannedCount を結果キーとして、ConsumedCapacity を非集計キーとして挙げています。

分かりやすい証拠は、仕事量が変わっていないのに数字が動くことです。同じテーブル、読んだのは同じ 600 件、フラグを 1 つ足しただけです。

--page-size 50  ->  { "Count": 8, "ScannedCount": 600, "CU": 24.0 }

CLI のスキャンからテーブルのサイジングをするなら、--page-size--starting-token で自分でページを合計するか、CloudWatch からキャパシティを読んでください。

--max-items はスキャンを止めない

--max-items 3 は安上がりなサンプリングのように読めます。違います。

--max-items 3  ->  { "Count": 8, "ScannedCount": 600 }

CLI は必要な件数の一致が集まるまでページを要求し続けました。選択性の高いフィルタでは、それはテーブル全体を意味します。その後、出力するリストを切り詰めただけです。CLI 自身の再開トークンがそれを明言しています。

{"ExclusiveStartKey": {"Artist": {"S": "Arturo Sandoval"},
 "SongTitle": {"S": "Cubano Chant 0541"}}, "boto_truncate_amount": 3}

boto_truncate_amount はクライアント側のカウンタです。DynamoDB が読む量を制限するには --page-size を使ってください。これは基盤となる各リクエストに API の Limit を設定します。再開は --starting-token で行います。

aws dynamodb scan \
  --table-name 'Music' \
  --page-size 500 \
  --max-items 100 \
  --starting-token "$NEXT_TOKEN"

2026-07-28 に、aws-cli/2.36.9 で DynamoDB Local(amazon/dynamodb-local)に対して測定しました。上記の JSON は CLI 自身の出力を、幅の都合で --query によって整形したものです。

解説

  • --filter-expression は読み取りの後に走る ので、出力は小さくなっても請求は小さくなりません。Year は予約語なので、#filter0--expression-attribute-names を通じて Year のエイリアスになっています。
  • --expression-attribute-values は数値を二重にクォートすることを求めます。JSON 全体を囲むシェルのクォートと、値そのものを JSON の文字列にすることです。内側のクォートを落とすと DynamoDB には届きません。CLI がローカルで Invalid type for parameter ExpressionAttributeValues.:v.N, value: 2010, type: <class 'int'>, valid types: <class 'str'> と拒否します。
  • API 呼び出しを変えるフラグは --page-size です。これは基盤となる各リクエストの Limit になり、1 ページあたりに評価されるアイテム数を抑えます。ページネーション一族の残り(--max-items--starting-token)は、CLI が自分の出力を管理しているだけです。
  • 並列スキャン はワーカーごとに --segment N --total-segments M を必要とし、各ワーカーが自分の --starting-token を持ちます。買えるのは実時間であって、キャパシティではありません。

ビジュアルに行う

DynamoDB 式ビルダーは、フィルタと 2 つの JSON マップをシェル用にエスケープ済みで出力するので、DynamoDB に届く前に CLI の式を失敗させるクォーティングの層を取り除けます。

テーブルを GUI で、フィルタとページ送りの効いたグリッドとともに探索するには、端末から手探りでスキャンする代わりに DynoTable をダウンロードしてください。

関連ガイド

参考資料

このリクエストをビジュアルに組み立てる

この操作を無料の DynamoDB クエリビルダーで組み立て — キー条件、フィルタ、インデックス、Limit、ソート順、ページネーションループ — 実行可能な SDK v3・CLI・boto3 のプログラムとしてコピーして戻れます。

DynamoDB クエリビルダーを開く

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。