Attribute name is a reserved keyword
TL;DR — Usaste un nombre de atributo que es una de las palabras reservadas de DynamoDB (hay ~570 — status, name, size, type, data, year, count y muchas más) directamente en una expresión. Sustitúyelo por un marcador de posición de ExpressionAttributeNames — #status mapeado a status — y la petición pasará.
Qué significa
ValidationException: 1 validation error detected: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: status
ValidationException: 1 validation error detected: Invalid KeyConditionExpression: Attribute name is a reserved keyword; reserved keyword: nameDynamoDB mantiene una lista de palabras reservadas que no pueden aparecer literalmente en una expresión (UpdateExpression, ConditionExpression, FilterExpression, KeyConditionExpression, ProjectionExpression). Cuando tu atributo resulta ser una de ellas, el analizador rechaza la expresión. Es un ValidationException (HTTP 400), no reintentable hasta que le pongas un alias al nombre. El mensaje nombra la palabra reservada exacta.
Por qué ocurre
- Un nombre de atributo común choca con una palabra reservada —
status,name,size,type,data,year,count,timestamp,source,regiony cientos más están reservadas. - Un
ProjectionExpressionque lista directamente un nombre de atributo reservado. - Un
FilterExpression/ConditionExpressionque referencia un nombre reservado (#status = :sfunciona;status = :sno). - Un nombre de atributo que empieza por un número, o contiene un espacio, un punto o un guion — estos también requieren un alias de
ExpressionAttributeNames, y producen un error de validación relacionado.
Cómo solucionarlo
- Ponle un alias al nombre con
ExpressionAttributeNames. Mapea un#placeholderal nombre real y usa el marcador de posición en la expresión:await doc.send( new UpdateCommand({ TableName: 'Orders', Key: {pk: 'ORDER#1'}, UpdateExpression: 'SET #status = :s', ExpressionAttributeNames: {'#status': 'status'}, ExpressionAttributeValues: {':s': 'shipped'} }) ); - Un marcador de posición debe empezar por
#seguido de caracteres alfanuméricos/guion bajo, y cada#nameque uses debe estar definido (y cada uno definido, usado). - Ponle alias de forma defensiva — poner alias a cada nombre de atributo en tus expresiones evita tener que saber nunca qué palabras están reservadas.
- Ponle a los nombres que contienen un punto literal un único marcador de posición — un atributo llamado literalmente
Safety.Warningnecesita un solo alias para todo el nombre ({'#sw': 'Safety.Warning'}), porque un.sin alias se lee como un separador de ruta de documento. Para una ruta genuinamente anidada, pon alias a cada segmento en su lugar (#pr.#5star).
FAQ
¿Cómo soluciono "Attribute name is a reserved keyword" en DynamoDB? Ponle un alias al atributo con ExpressionAttributeNames. Mapea un marcador de posición como #status al nombre real "status" y usa #status en la expresión en lugar de la palabra literal. El marcador de posición debe empezar por # y cada uno que definas debe usarse.
¿Qué nombres de atributo de DynamoDB están reservados? Hay alrededor de 570 palabras reservadas, incluyendo nombres cotidianos como status, name, size, type, data, year, count, timestamp y region. En lugar de memorizar la lista, ponle un alias a cada nombre de atributo en tus expresiones con ExpressionAttributeNames.
Errores relacionados
- Invalid UpdateExpression syntax — estructura de expresión mal formada.
- ValidationException (visión general) — la familia de errores de validación al completo.
- Ejemplo de código: UpdateItem in Node.js · en Python (boto3) — palabras reservadas con alias mediante marcadores #.
- Aprende: Expression names & values · Update expressions
Referencias
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
Última verificación el 2026-07-13 con la documentación oficial de AWS enlazada arriba.