Attribute name is a reserved keyword
TL;DR — Tu as utilisé un nom d'attribut qui est l'un des mots réservés de DynamoDB (il y en a ~570 — status, name, size, type, data, year, count, et bien d'autres) directement dans une expression. Remplace-le par un placeholder ExpressionAttributeNames — #status mappé à status — et la requête passe.
Ce que ça signifie
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 maintient une liste de mots réservés qui ne peuvent pas apparaître littéralement dans une expression (UpdateExpression, ConditionExpression, FilterExpression, KeyConditionExpression, ProjectionExpression). Quand ton attribut se trouve être l'un d'eux, l'analyseur rejette l'expression. C'est une ValidationException (HTTP 400), non réessayable tant que tu n'as pas donné un alias au nom. Le message nomme le mot réservé exact.
Pourquoi ça arrive
- Un nom d'attribut courant entre en collision avec un mot réservé —
status,name,size,type,data,year,count,timestamp,source,region, et des centaines d'autres sont réservés. - Une
ProjectionExpressionqui liste directement un nom d'attribut réservé. - Une
FilterExpression/ConditionExpressionréférençant un nom réservé (#status = :sfonctionne ;status = :snon). - Un nom d'attribut qui commence par un chiffre, ou contient un espace, un point ou un tiret — ceux-ci nécessitent aussi un alias
ExpressionAttributeNames, et produisent une erreur de validation liée.
Comment le corriger
- Donne un alias au nom avec
ExpressionAttributeNames. Mappe un#placeholderau vrai nom et utilise le placeholder dans l'expression :await doc.send( new UpdateCommand({ TableName: 'Orders', Key: {pk: 'ORDER#1'}, UpdateExpression: 'SET #status = :s', ExpressionAttributeNames: {'#status': 'status'}, ExpressionAttributeValues: {':s': 'shipped'} }) ); - Un placeholder doit commencer par
#suivi de caractères alphanumériques/underscore, et chaque#nameutilisé doit être défini (et chaque défini utilisé). - Donne des alias par précaution — donner un alias à chaque nom d'attribut dans tes expressions évite d'avoir à savoir quels mots sont réservés.
- Donne un alias aux noms contenant un point littéral avec un seul placeholder — un attribut littéralement nommé
Safety.Warninga besoin d'un seul alias pour tout le nom ({'#sw': 'Safety.Warning'}), car un.sans alias est lu comme un séparateur de chemin de document. Pour un chemin réellement imbriqué, donne plutôt un alias à chaque segment (#pr.#5star).
FAQ
Comment corriger « Attribute name is a reserved keyword » dans DynamoDB ? Donne un alias à l'attribut avec ExpressionAttributeNames. Mappe un placeholder tel que #status au vrai nom « status » et utilise #status dans l'expression au lieu du mot littéral. Le placeholder doit commencer par # et chacun que tu définis doit être utilisé.
Quels noms d'attributs DynamoDB sont réservés ? Il y a environ 570 mots réservés, y compris des noms courants comme status, name, size, type, data, year, count, timestamp et region. Plutôt que de mémoriser la liste, donne un alias à chaque nom d'attribut dans tes expressions avec ExpressionAttributeNames.
Erreurs liées
- Invalid UpdateExpression syntax — structure d'expression mal formée.
- ValidationException (vue d'ensemble)
- Exemple de code : UpdateItem en Node.js · en Python (boto3) — mots réservés aliassés avec des #placeholders.
- En savoir plus : Noms et valeurs d'expression · Expressions de mise à jour
Références
- 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
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.