The provided starting key is invalid

TL;DR — ExclusiveStartKey が、ページングしているものの キースキーマと一致しません。DynamoDB が LastEvaluatedKey で返したキー属性 — 完全なプライマリキー、そして GSI/LSI を照会しているときはインデックスキーも — を、同じ名前と型で正確に含む必要があります。LastEvaluatedKey をそのまま渡してください。手作業で組み立てるのがこれが壊れる原因です。

意味

ValidationException: The provided starting key is invalid
ValidationException: Exclusive Start Key must have same size as table's key schema

ExclusiveStartKey は、Query/Scan にどこから再開するかを伝えます。DynamoDB はそれをテーブルのキースキーマ — またはインデックスクエリでは、LastEvaluatedKey が運ぶインデックス + テーブルの結合キー — に対して検証します。属性の欠落、余分な属性、誤った名前、誤った型はすべて、データが読まれる前に失敗します。

発生する理由

  • パーティションキーだけでキーを手作り — 複合キーのテーブルは、開始キーにパーティション ソートキーが必要です。
  • テーブルキーだけでインデックスをページング — GSI/LSI クエリの LastEvaluatedKey は、インデックスキー属性とテーブルのプライマリキーの両方を含みます。そのすべてが返される必要があります。
  • 型または名前のドリフト — キーがシリアライズされ(JSON、URL パラメータ、キャッシュ)、LastEvaluatedKey が数値だった場所に "42" で戻ってきた、または名前が変わったフィールドで。
  • クエリ間でのキーの再利用 — あるテーブル/インデックスの LastEvaluatedKey を別のものに対するクエリに渡した、または同じクエリでもキースキーマの仮定が変わった後に。
  • デフォルトを注入するラッパー — キーに属すると考える属性を埋める ODM が、開始キーをスキーマサイズを超えて水増しできる。

修正方法

  1. LastEvaluatedKey を手を触れずに往復させます:

    let ExclusiveStartKey;
    do {
      const page = await docClient.send(
        new QueryCommand({
          TableName,
          KeyConditionExpression,
          ExpressionAttributeValues,
          ExclusiveStartKey
        })
      );
      items.push(...(page.Items ?? []));
      ExclusiveStartKey = page.LastEvaluatedKey; // verbatim — no rebuild
    } while (ExclusiveStartKey);
  2. リクエスト境界を越える場合はロスなくシリアライズします — ページネーションカーソルがブラウザに行って戻るとき、アイテムのフィールドから再構築するのではなく、LastEvaluatedKey オブジェクト全体をエンコード(例: その JSON の base64)し、数値型は数値のまま保ちます。

  3. インデックスのページングにはすべてのキー属性を含めます — インデックスのパーティション/ソートキー テーブルのパーティション/ソートキーを、返されたとおり正確に。

  4. 開始点をでっち上げないでください — DynamoDB のページネーションにオフセットはありません。「X の近くから開始」が必要なら、手作りの ExclusiveStartKey ではなく KeyConditionExpressionsk > :x)で表現します。

LastEvaluatedKey がテーブルやインデックスで実際に何を含むかを検査すると、推測が不要になります。DynoTable デスクトップアプリ はクエリをページ送りして生のカーソルを表示し、DynamoDB Expression Builder はその周りにクエリリクエストを組み立てます。

DynoTable でクエリ

DynoTable で Query をページングし、ページのあいだで生の LastEvaluatedKey カーソルを確認しましょう — ⌘K でテーブルを開き、Query を実行し、ページネーションのトークンをそのまま SDK のループにコピーします。クエリパネルは、DynamoDB がどのキー属性を期待しているかを正確に示します。

クエリビルダーを使えば、ExclusiveStartKey を正しく扱うページング付きの Query プログラムを生成できます。プロファイルの切り替えは ⌘P、Settings → Profiles では Test Connection を実行します。AWS に接続するインストールを参照してください。

出典

関連するエラー

参考資料

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

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

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