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: name

DynamoDB 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 reservadastatus, name, size, type, data, year, count, timestamp, source, region y cientos más están reservadas.
  • Un ProjectionExpression que lista directamente un nombre de atributo reservado.
  • Un FilterExpression/ConditionExpression que referencia un nombre reservado (#status = :s funciona; status = :s no).
  • 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

  1. Ponle un alias al nombre con ExpressionAttributeNames. Mapea un #placeholder al 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'}
      })
    );
  2. Un marcador de posición debe empezar por # seguido de caracteres alfanuméricos/guion bajo, y cada #name que uses debe estar definido (y cada uno definido, usado).
  3. 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.
  4. Ponle a los nombres que contienen un punto literal un único marcador de posición — un atributo llamado literalmente Safety.Warning necesita 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

Referencias

Última verificación el 2026-07-13 con la documentación oficial de AWS enlazada arriba.

Trabaja con DynamoDB sin la Consola

Un cliente de escritorio rápido para DynamoDB que ejecuta el SQL real que DynamoDB no puede — JOINs, GROUP BY, agregaciones — con edición visual y un agente de IA con tus propias claves de Bedrock.

Prueba gratuita de 30 días, sin tarjeta — después, el plan Free sin límite de tiempo.