DynamoDB TTL attribute must be a Number
TL;DR — O Time to Live do DynamoDB só exclui um item quando seu atributo TTL designado contém um Number representando um timestamp de época Unix em segundos. Uma String como "1735689600", um valor em milissegundos, uma data ISO-8601, ou um atributo ausente é silenciosamente ignorado — o item nunca expira. Armazene o TTL como um Number de segundos de época e reescreva os itens afetados.
O que significa
# A second UpdateTimeToLive call within one hour of the first raises:
ValidationException (TTL settings can only be modified once per table per hour)
# The quieter failure — no error at all, item just never expires:
TTL attribute "expiresAt" = "2026-01-01T00:00:00Z" ← String, ignored
TTL attribute "expiresAt" = 1735689600000 ← milliseconds: tens of thousands of years awayHabilitar o TTL (UpdateTimeToLive) é bem-sucedido mesmo quando o atributo ainda não existe ou é do tipo errado — o DynamoDB não faz verificação de tipo de antemão. A falha aparece depois: o processo TTL em segundo plano só exclui um item quando o atributo é um Number contendo um timestamp de época Unix em segundos que está no passado (e não mais que cinco anos no passado). Qualquer outra coisa é tratada como "sem expiração".
Por que isso acontece
- Armazenado como String — o valor é
{"S": "1735689600"}em vez de{"N": "1735689600"}. O TTL ignora tipos não-N. - Milissegundos em vez de segundos —
Date.now()(JavaScript) retorna milissegundos; um valor de 13 dígitos está dezenas de milhares de anos no futuro, então o item efetivamente nunca expira. - Uma string de data ISO-8601 / legível em vez de segundos de época.
- Um timestamp mais de cinco anos no passado — o processo TTL o ignora em vez de excluir o item.
- Um nome de atributo diferente daquele registrado com o TTL (o nome é sensível a maiúsculas).
- Chamar
UpdateTimeToLivenovamente cedo demais — a mudança leva até uma hora para processar completamente, e qualquer chamadaUpdateTimeToLiveadicional para a mesma tabela durante essa hora levanta umValidationException.
Como corrigir
- Escreva o valor de TTL como um Number em segundos de época —
Math.floor(Date.now() / 1000) + ttlSecondsem JavaScript,int(time.time()) + ttlem Python. Nunca armazene milissegundos. - Use o tipo
N, nãoS. Com o cliente de baixo nível isso é{"N": "1735689600"}; o Document Client faz marshal de um número nativo por você. - Combine o nome de atributo registrado exatamente, incluindo maiúsculas. Confirme-o com
DescribeTimeToLive. - Faça backfill dos itens existentes — itens escritos antes da correção ainda carregam o valor ruim; reescreva-os com um Number correto de segundos de época.
- Espere uma hora entre mudanças de config de TTL —
UpdateTimeToLiveleva até uma hora para processar, e chamadas adicionais durante essa janela são rejeitadas com umValidationException.
Quer ver o tipo de fio de todo atributo enquanto navega por uma tabela? O app desktop DynoTable renderiza tags de tipo N/S/M inline, então um TTL armazenado como String se destaca antes de custar um item não expirado.
FAQ
Por que meu TTL do DynamoDB não está excluindo itens? O atributo TTL precisa ser um Number contendo um timestamp de época Unix em segundos. Um valor de String, um valor em milissegundos, uma data ISO, ou um nome que não corresponde ao atributo TTL registrado são todos silenciosamente ignorados, então o item nunca expira. A exclusão também não é imediata — o DynamoDB tipicamente remove itens expirados dentro de alguns dias de seu horário de expiração.
O DynamoDB valida o tipo do atributo TTL quando eu habilito o TTL?
Não. UpdateTimeToLive é bem-sucedido mesmo se o atributo está ausente ou é do tipo errado. O requisito de tipo (Number, segundos de época) só é imposto pelo processo de exclusão em segundo plano, e é por isso que um TTL ruim falha silenciosamente.
Erros relacionados
- Float / decimal number types not supported — uma armadilha de tipagem de número relacionada.
- ValidationException (overview)
- Aprenda: DynamoDB TTL · DynamoDB data types
Referências
- Using time to live (TTL) in DynamoDB — Amazon DynamoDB Developer Guide
- Computing time to live (TTL) in DynamoDB — Amazon DynamoDB Developer Guide
- Enable time to live (TTL) in DynamoDB — Amazon DynamoDB Developer Guide
- UpdateTimeToLive — Amazon DynamoDB API Reference
Verificado pela última vez em 2026-07-13 contra a documentação oficial da AWS vinculada acima.