Filter Expression can only contain non-primary key attributes

TL;DR — FilterExpression の中に プライマリキー属性(照会しているテーブルまたはインデックスのパーティションキーやソートキー)を入れました。DynamoDB はそれを禁止します: キー属性は KeyConditionExpression に、フィルターは 非キー 属性のみを参照できます。キー条件をあるべき場所に移してください。

意味

ValidationException: Filter Expression can only contain non-primary key attributes:
Primary key attribute: <name>

# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: Filter Expression can only contain non-primary key attributes: Primary key attribute: pk

FilterExpression はアイテムが読み取られた に実行され、不要な行を破棄します。KeyConditionExpression に実行され、どのアイテムをキーで読み取るかを選択します。フィルターでパーティション/ソートキーを参照するとそれらの役割が混ざるため、DynamoDB は HTTP 400 の ValidationException で拒否します。再構成するまで クライアント側の問題でリトライ不可 です。

発生する理由

  • フィルターとして書かれたキー条件sk がソートキーなのに FilterExpression: 'sk = :v'。それは KeyConditionExpression に属します。
  • インデックスのキーでのフィルタリング — GSI/LSI を Query するとき、そのインデックス自身のパーティション/ソートキーはこのクエリにとって「プライマリキー属性」であり、フィルターに現れることはできません。
  • フィルタされた属性の1つがたまたまキーである スキャンフィルターをクエリにコピペ している。
  • キー条件で表現する代わりに、フィルター経由でソートキーに2つ目の条件(例: 範囲)を 追加しようとしている

修正方法

  1. キー条件を KeyConditionExpression に移します:
    KeyConditionExpression: 'pk = :pk AND begins_with(sk, :prefix)',
    // FilterExpression: only NON-key attributes, e.g. 'status = :active'
  2. 正しいインデックスを使います。 キーでない属性でフィルタ/選択する必要がある場合、それを GSI のパーティション/ソートキーとしてモデリングし、そのインデックスをキーで照会します。
  3. フィルターは非キー属性のみに保ちます — 結果を絞りますが、スキャンされたすべてのアイテムに対して読み取りキャパシティを消費するため、選択にはキー/インデックスに頼りましょう。
  4. GSI を照会していますか? そのキー属性もフィルターでは禁止されていることを忘れないでください。キー条件でそれらを条件付けます。

DynoTable で実行する

DynoTable のクエリパネルは、キー条件とフィルターを別々のフィールドに分けています — パーティションキーとソートキーの条件が FilterExpression に紛れ込むことはありません。⌘K でテーブルを開き、キー条件を設定してから、キー以外のフィルターを追加してください。生成されたリクエストはそのまま SDK にコピーできます。

インデックスのキーを KeyConditionExpression に置いたままにしなければならない GSI クエリは、クエリビルダーで試作しましょう。プロファイルの切り替えは ⌘P、Settings → Profiles の Test Connection がインデックスの存在を確認してくれます。AWS に接続するインストールを参照してください。

出典

関連するエラー

参考資料

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

Console なしで DynamoDB を扱う

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

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