ValidationException: Invalid UpdateExpression
TL;DR — UpdateExpression が不正な形式です。10回中9回は、予約語(status、name、size など)を直接使ったことです。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: :sDynamoDB は式文字列を解析し、有効な文法でないもの、または未定義のプレースホルダーを参照するものを拒否します。
発生する理由
- 予約語を素で使用。 DynamoDB には 数百の予約語 があります —
status、name、size、count、data、year。式で直接使うと構文エラーになります。予約語チェッカーは、属性名を完全なリストに対してテストし、エイリアスマップを出力します。 - 参照した
#nameのExpressionAttributeNamesエントリの欠落。 - 参照した
:valueのExpressionAttributeValuesエントリの欠落。 - 誤った動詞の文法 — 句を誤って混在させる(
SET、REMOVE、ADD、DELETEはそれぞれ独自の構文を持つ)、または迷い込んだ=。 - プレースホルダーなしで使われた 特殊文字(ドット、ダッシュ)を含む属性名。
修正方法
- すべての属性名を
ExpressionAttributeNames(#status)経由でエイリアス化します — 予約語リストを完全に回避するため、すべてをエイリアス化するのは安全な習慣です。 - 参照する すべての
:valueをExpressionAttributeValuesで定義します。 - 正しい句を使います。 書き込み/上書きには
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 に接続するとインストールを参照してください。エラーが status や data のような具体的なトークンを名指ししているときは、予約語チェッカーで属性名を突き合わせます。予約語だけでなくすべての属性名にエイリアスを付けるのは、この種のエラーを丸ごと防げる安全な習慣です。
出典
- Using update expressions in DynamoDB (2026-07-13 時点で検証)
- Reserved words in DynamoDB (2026-07-13 時点で検証)
関連するエラー
- ExpressionAttributeValues contains invalid value
- ValidationException (overview)
- Code example: UpdateItem in Node.js · in Python (boto3) — #names と :values を使った有効な UpdateExpression。
- 学習: Update Expression · 式属性名と値
参考資料
- Using update expressions in DynamoDB — Amazon DynamoDB Developer Guide
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。