Attribute name is a reserved keyword

TL;DR — Você usou um nome de atributo que é uma das palavras reservadas do DynamoDB (há ~570 — status, name, size, type, data, year, count, e muitas mais) diretamente em uma expressão. Substitua-o por um placeholder de ExpressionAttributeNames#status mapeado para status — e a requisição passa.

O que 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

O DynamoDB mantém uma lista de palavras reservadas que não podem aparecer literalmente em uma expressão (UpdateExpression, ConditionExpression, FilterExpression, KeyConditionExpression, ProjectionExpression). Quando seu atributo por acaso é uma delas, o parser rejeita a expressão. É um ValidationException (HTTP 400), não retentável até você aliasar o nome. A mensagem nomeia a palavra reservada exata.

Por que isso acontece

  • Um nome de atributo comum colide com uma palavra reservadastatus, name, size, type, data, year, count, timestamp, source, region, e centenas mais são reservadas.
  • Um ProjectionExpression que lista um nome de atributo reservado diretamente.
  • Um FilterExpression/ConditionExpression referenciando um nome reservado (#status = :s funciona; status = :s não).
  • Um nome de atributo que começa com um número, ou contém um espaço, ponto ou hífen — estes também exigem um alias de ExpressionAttributeNames, e produzem um erro de validação relacionado.

Como corrigir

  1. Aliase o nome com ExpressionAttributeNames. Mapeie um #placeholder para o nome real e use o placeholder na expressão:
    await doc.send(
      new UpdateCommand({
        TableName: 'Orders',
        Key: {pk: 'ORDER#1'},
        UpdateExpression: 'SET #status = :s',
        ExpressionAttributeNames: {'#status': 'status'},
        ExpressionAttributeValues: {':s': 'shipped'}
      })
    );
  2. Um placeholder precisa começar com # seguido de alfanuméricos/underscore, e todo #name usado precisa ser definido (e todo definido, usado).
  3. Aliase defensivamente — aliasar todo nome de atributo em suas expressões evita ter que saber quais palavras são reservadas.
  4. Aliase nomes que contêm um ponto literal com um único placeholder — um atributo literalmente chamado Safety.Warning precisa de um alias para o nome inteiro ({'#sw': 'Safety.Warning'}), porque um . não aliasado é lido como um separador de document-path. Para um caminho genuinamente aninhado, aliase cada segmento em vez disso (#pr.#5star).

FAQ

Como corrijo "Attribute name is a reserved keyword" no DynamoDB? Aliase o atributo com ExpressionAttributeNames. Mapeie um placeholder como #status para o nome real "status" e use #status na expressão em vez da palavra literal. O placeholder precisa começar com # e todo um que você define precisa ser usado.

Quais nomes de atributo do DynamoDB são reservados? Há cerca de 570 palavras reservadas, incluindo nomes cotidianos como status, name, size, type, data, year, count, timestamp e region. Em vez de memorizar a lista, aliase todo nome de atributo em suas expressões com ExpressionAttributeNames.

Erros relacionados

Referências

Verificado pela última vez em 2026-07-13 contra a documentação oficial da AWS vinculada acima.

Trabalhe com o DynamoDB sem o Console

Um cliente desktop rápido para DynamoDB que roda o SQL de verdade que o DynamoDB não consegue — JOINs, GROUP BY, agregações — com edição visual e um agente de IA com suas próprias chaves do Bedrock.

Teste grátis de 30 dias, sem cartão de crédito — depois o plano Grátis sem limite de tempo.