ValidationException: Invalid UpdateExpression

TL;DR — UpdateExpression が不正な形式です。10回中9回は、予約語(statusnamesize など)を直接使ったことです。ExpressionAttributeNames#placeholder に置き換えてください。メッセージが正確なトークンを示します。

意味

典型的なメッセージ:

ValidationException: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: status
ValidationException: Invalid UpdateExpression: Syntax error; token: "=", near: "SET status ="
ValidationException: Invalid UpdateExpression: An expression attribute value used in expression is not defined; attribute value: :s

DynamoDB は式文字列を解析し、有効な文法でないもの、または未定義のプレースホルダーを参照するものを拒否します。

発生する理由

  • 予約語を素で使用。 DynamoDB には 数百の予約語 があります — statusnamesizecountdatayear。式で直接使うと構文エラーになります。予約語チェッカーは、属性名を完全なリストに対してテストし、エイリアスマップを出力します。
  • 参照した #nameExpressionAttributeNames エントリの欠落。
  • 参照した :valueExpressionAttributeValues エントリの欠落。
  • 誤った動詞の文法 — 句を誤って混在させる(SETREMOVEADDDELETE はそれぞれ独自の構文を持つ)、または迷い込んだ =
  • プレースホルダーなしで使われた 特殊文字(ドット、ダッシュ)を含む属性名

修正方法

  1. すべての属性名を ExpressionAttributeNames#status)経由でエイリアス化します — 予約語リストを完全に回避するため、すべてをエイリアス化するのは安全な習慣です。
  2. 参照する すべての :valueExpressionAttributeValues で定義します
  3. 正しい句を使います。 書き込み/上書きには SET、属性の削除には REMOVE、アトミックな数値/セットの増分には ADD、セットからの削除には DELETE

import {DynamoDBClient} from '@aws-sdk/client-dynamodb';
import {DynamoDBDocumentClient, UpdateCommand} from '@aws-sdk/lib-dynamodb';

const doc = DynamoDBDocumentClient.from(new DynamoDBClient({}));

await doc.send(
  new UpdateCommand({
    TableName: 'Orders',
    Key: {pk: 'ORDER#1'},
    // #status aliases the reserved word "status"
    UpdateExpression: 'SET #status = :s, updatedAt = :t',
    ExpressionAttributeNames: {'#status': 'status'},
    ExpressionAttributeValues: {':s': 'SHIPPED', ':t': Date.now()}
  })
);

まず DynoTable で確認

アプリで更新が失敗したら、本番コードを変える前に DynoTable で再現しましょう。⌘K でテーブルを開き、アイテムを選び、インラインの更新エディタを使います — DynoTable は予約語の属性名を自動でエイリアス化し、生成された UpdateExpression を 2 つの属性マップと一緒に表示します。ステージング(⌘S)を使えば、編集をプレビューしてコミット前に構文エラーを捕まえられます。

まとめて直すなら、失敗している式を式ビルダーに貼り付け、その出力を SDK が送っているものと比べてください。プロファイルの切り替え(⌘P)で、テスト実行をエラーと同じアカウントに保てます。Settings → Profiles の Test Connection でプロファイルが一致していることを確認しましょう。プロファイルの設定はAWS に接続するインストールを参照してください。エラーが statusdata のような具体的なトークンを名指ししているときは、予約語チェッカーで属性名を突き合わせます。予約語だけでなくすべての属性名にエイリアスを付けるのは、この種のエラーを丸ごと防げる安全な習慣です。

出典

関連するエラー

参考資料

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

Console なしで DynamoDB を扱う

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

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