Provided list of item keys contains duplicates (BatchGetItem)

TL;DR — 1つのテーブルに対する BatchGetItemKeys 配列が、同じプライマリキーを複数回列挙しています。DynamoDB はバッチ内のすべてのキーが一意であることを要求し、リクエスト全体 を拒否します。重複を黙って削除することはしません。送信前にキーリストを重複排除してください。

意味

ValidationException: Provided list of item keys contains duplicates

BatchGetItem はテーブルをまたいで最大100アイテムを読み取ります。1つのテーブルの Keys リスト内では、各エントリは別個のプライマリキー(パーティションキー、または複合テーブルではパーティション + ソートキー)である必要があります。同じキーに解決される2つのエントリはこの HTTP 400 ValidationException を引き起こし、呼び出し全体が失敗します。アイテムは返されません。そのままでは リトライ不可 です。

発生する理由

  • リスト内に 同じキーが2回現れる — 多くの場合、ID が複数のソースから収集され、マージされなかったため。
  • ソースに重複行があった 生成されたキーリスト(例: レコードのリストをキーにマッピング)。
  • 複合キーの混乱 — 2つのエントリがパーティションキーを共有するが、ソートキーが異なることを忘れた、あるいは両方が本当に同一である。
  • 実際の重複を隠す 大文字小文字 / 型の違い — 同じ値にマーシャルされる2つのキー。
  • 重複排除ステップなしにキーをバッチ化するロードパイプライン(Glue、カスタム ETL)。

修正方法

  1. 呼び出し前に重複排除します。 各エントリを安定した文字列でキー化し、1つだけ保持します:
    const seen = new Set();
    const keys = raw.filter((k) => {
      const id = `${k.pk.S}#${k.sk?.S ?? ''}`;
      if (seen.has(id)) return false;
      seen.add(id);
      return true;
    });
  2. バッチはバッグではなくセットであることを忘れないでください — キーごとに読み取りは1回で十分です。アイテムは関係なく1回返ってきます。
  3. BatchGetItem ごとに100キーへチャンク分割 し、レスポンス内の UnprocessedKeys を処理します(重複ではなくスロットリング)。
  4. ETL/ローダーを同じ重複排除でガード し、上流で問題が再発しないようにします。

手作業でバッチを読み取り、送信するキーを正確に確認したいですか?DynoTable デスクトップアプリ はアイテムをキー別に表示するため、作業セット内の偶発的な重複が見つけやすくなります。

DynoTable での手順

本番からキーをバッチ読み取りする前に、DynoTable で重複を見つけましょう — ⌘K でテーブルを開き、取得予定の ID に絞り込み、それぞれのプライマリキーが 1 回しか現れないことを確かめます。アイテム一覧はパーティションキーとソートキーを並べて表示するので、複合キーの衝突がひと目で分かります。

読み取りをコードに移すときは、まずクエリビルダーで単一キーの読み取りを試作し、それから分割した BatchGetItem に広げましょう。プロファイルの切り替えは ⌘P、設定は Settings → Profiles で行い、Test Connection を実行します。AWS に接続するインストールを参照してください。

出典

関連するエラー

参考資料

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

Console なしで DynamoDB を扱う

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

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