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: nameO 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 reservada —
status,name,size,type,data,year,count,timestamp,source,region, e centenas mais são reservadas. - Um
ProjectionExpressionque lista um nome de atributo reservado diretamente. - Um
FilterExpression/ConditionExpressionreferenciando um nome reservado (#status = :sfunciona;status = :snã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
- Aliase o nome com
ExpressionAttributeNames. Mapeie um#placeholderpara 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'} }) ); - Um placeholder precisa começar com
#seguido de alfanuméricos/underscore, e todo#nameusado precisa ser definido (e todo definido, usado). - Aliase defensivamente — aliasar todo nome de atributo em suas expressões evita ter que saber quais palavras são reservadas.
- Aliase nomes que contêm um ponto literal com um único placeholder — um atributo literalmente chamado
Safety.Warningprecisa 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
- Invalid UpdateExpression syntax — estrutura de expressão malformada.
- ValidationException (overview)
- Exemplo de código: UpdateItem in Node.js · in Python (boto3) — palavras reservadas aliasadas com placeholders #.
- Aprenda: Expression names & values · Update expressions
Referências
- 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
Verificado pela última vez em 2026-07-13 contra a documentação oficial da AWS vinculada acima.