Value provided in ExpressionAttributeValues unused in expressions

TL;DR — ExpressionAttributeValues に、どの式も参照しない 値プレースホルダー(例: :status)を渡しました。DynamoDB は、宣言したすべての :valueKeyConditionExpressionFilterExpressionUpdateExpression、または ConditionExpression で使用することを要求します。孤立した値を削除するか、それを使うはずだった式を修正してください。

意味

ValidationException: 1 validation error detected: Value provided in ExpressionAttributeValues unused in
expressions: keys: {:status}

# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: 1 validation error detected: Value provided in ExpressionAttributeValues unused in expressions: keys: {:status}

ExpressionAttributeValues は、式が比較するリテラル値(:status:min など)の置換マップです。DynamoDB は双方向の契約を強制します: 式で使うすべての :placeholder は宣言される必要があり、かつ 宣言するすべてのプレースホルダーは使用される必要があります。どの式も参照しない残りの値は、この HTTP 400 の ValidationException を引き起こします。クライアント側の問題で、マップが一致するまでリトライ不可です。

発生する理由

  • 式を編集した後に残った古い値 — 式から #s = :status を落としたが、値マップに :status を残した。
  • コピペのドリフト — 現在より多くの条件を持っていた以前のリクエストの値マップを再利用している。
  • 過剰に宣言する生成されたリクエスト — ビルダーが後で削除されたフィルター句に :v を追加した。
  • 名前 vs 値の取り違え#status(名前エイリアス)のつもりが :status(値)を宣言した。
  • タイプミス — 式が :stat を使うのにマップが :status を宣言している。

修正方法

  1. メッセージが示す 未使用の値を削除しますExpressionAttributeValues から。
  2. 値を式と歩調を合わせて保ちます — 式が参照するときにのみ :placeholder を宣言します。
  3. 名前 vs 値を確認します: プレースホルダーは ExpressionAttributeValues に、# エイリアスは ExpressionAttributeNames に。
  4. 式とそのマップを一緒に組み立て、値が宙ぶらりんにならないようにします。

DynoTable でクエリ

DynoTable は設定したフィルター行から ExpressionAttributeValues を生成します — 出力に現れる :placeholder はすべて式の文字列から参照されています。⌘K でテーブルを開き、クエリパネルでフィルターを追加し、出力されたマップを SDK の呼び出しにコピーすれば、宙に浮いた値はなくなります。

失敗するリクエストを調べるときは、式を式ビルダーに貼り付け、その値のマップを自分のものと比べましょう。プロファイルの切り替え(⌘P)と Settings → Profiles の Test Connection で、同じテーブルに対して試していることを確認できます。AWS に接続するインストールを参照してください。

出典

関連するエラー

参考資料

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

Console なしで DynamoDB を扱う

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

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