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 はその周りにクエリリクエストを組み立てます。

関連するエラー

References

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

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。