Intermedio5 min de lectura

DynamoDB TTL: la guía completa para expirar elementos

Time to Live (TTL) permite a DynamoDB eliminar elementos automáticamente una vez que pasa una marca de tiempo que almacenas en ellos. Nombras un atributo que contiene una caducidad Unix-epoch, y DynamoDB recolecta los elementos caducados en segundo plano — sin trabajo recolector, sin coste extra.

En el escenario del registro de auditoría cada inquilino tiene una política de retención: conserva los eventos durante 90 días, o 1 año, o 7 para los de mucho cumplimiento. TTL es como impones eso sin ejecutar tu propia barrida de eliminación.

¿Cómo funciona el TTL de DynamoDB?

El TTL de DynamoDB elimina automáticamente los elementos una vez que pasa una marca de tiempo Unix-epoch (segundos) que almacenas en un atributo designado. Habilitas el TTL en la tabla, nombras el atributo de caducidad, y DynamoDB recolecta los elementos caducados en segundo plano — normalmente en unos pocos días, sin coste de capacidad de escritura. Los elementos caducados siguen siendo legibles hasta que se eliminan físicamente.

  • El TTL es un atributo que contiene una marca de tiempo Unix-epoch (segundos). Cuando ese momento pasa, el elemento pasa a ser elegible para eliminación.
  • La eliminación es en segundo plano y de mejor esfuerzo — normalmente en unos pocos días desde la caducidad, no en el segundo exacto.
  • Las eliminaciones por TTL son gratis — no consumen capacidad de escritura, aunque en una tabla global la eliminación replicada cuesta una escritura en cada otra región de réplica.
  • Los elementos caducados pero aún no eliminados siguen apareciendo en las lecturas, así que filtra por el atributo de caducidad si necesitas ocultarlos de inmediato.

El problema: caducar datos antiguos tú mismo es caro

Sin TTL, imponer "descarta los eventos de más de 90 días" significa ejecutar tu propio recolector: escanear (o consultar) elementos antiguos en un horario y hacer DeleteItem a cada uno. Ese escaneo quema capacidad de lectura, las eliminaciones queman capacidad de escritura, y tú te haces cargo del horario, los fallos y los reintentos.

Para un registro de auditoría de alto volumen es un impuesto constante y creciente solo para tirar datos a la basura. TTL mueve todo el trabajo dentro de DynamoDB, gratis.

Cómo funciona el TTL

Habilitas el TTL en una tabla y le dices qué atributo contiene la caducidad. Según el anuncio de AWS, designas un atributo del elemento que contiene una marca de tiempo de caducidad Unix-epoch, y DynamoDB gestiona la eliminación automáticamente en segundo plano sin afectar al rendimiento de la tabla.

Dos propiedades importan para la corrección:

  • Es de mejor esfuerzo, no exacto. DynamoDB escanea elementos caducados y los elimina en segundo plano; la eliminación normalmente ocurre en unos pocos días desde la caducidad. Un elemento es elegible en su marca de tiempo pero puede permanecer brevemente.
  • Los elementos caducados siguen siendo legibles hasta que se recolectan. Una Query puede devolver un elemento cuyo TTL ha pasado pero que aún no se ha eliminado — así que añade una FilterExpression sobre el atributo de caducidad si "caducado = invisible de inmediato" es un requisito estricto.

Y las eliminaciones por TTL no consumen capacidad de escritura, que es lo que las hace estrictamente más baratas que un recolector propio.

Un ejemplo resuelto: retención por inquilino

Cada evento de auditoría lleva un atributo expiresAt establecido cuando se escribe el evento — ahora + la ventana de retención del inquilino, en segundos epoch:

PKSKactionexpiresAtnote
TENANT#acmeEVENT#2026-03-26T…#a0login.success178225920090-day tenant: eligible now
TENANT#acmeEVENT#2026-06-24T…#a1invoice.export1790035200still inside window
TENANT#globex EVENT#2026-06-24T…#b9role.granted20031840007-year compliance tenant

El TTL se habilita con expiresAt como atributo de TTL. Cuando el evento de 90 días de acme cruza 1782259200, DynamoDB lo elimina por su cuenta en aproximadamente dos días. Los eventos del inquilino de cumplimiento llevan un expiresAt muy lejano en el futuro, así que sobreviven — misma tabla, mismo mecanismo, retención distinta por elemento.

El lado de escritura es simplemente añadir un número cuando creas el evento. Puedes componer la cláusula SET expiresAt = :ttl y verificar el valor tipado :ttl en el Generador de expresiones de DynamoDB.

Para ocultar de inmediato de una lectura un evento caducado pero no recolectado, añade expiresAt > :now a la FilterExpression de la consulta — aunque recuerda que un filtro no reduce el coste de lectura (query frente a scan).

Hazlo en DynoTable

El error clásico de TTL es un expiresAt equivocado: almacenado en milisegundos en lugar de segundos, o como una cadena ISO, de modo que el elemento o nunca caduca o desaparece de inmediato. La única forma de detectarlo es mirar el valor realmente almacenado y su tipo.

DynoTable muestra los atributos de cada elemento con sus tipos de DynamoDB, así que puedes confirmar que expiresAt es un Number en segundos epoch — no una String, no milisegundos — antes de confiar en el TTL con retención real.

Verificando que el atributo expiresAt de un evento de auditoría en DynoTable es un Number en segundos Unix-epoch, el único valor sobre el que actúa el TTL.
Verificando que el atributo expiresAt de un evento de auditoría en DynoTable es un Number en segundos Unix-epoch, el único valor sobre el que actúa el TTL.

Escollos y próximos pasos

  • Segundos epoch, como un Number. Este es el error de TTL más común con diferencia. Un valor en milisegundos empuja la caducidad ~50 000 años hacia el futuro; una cadena ISO se ignora por completo. Verifica el tipo y la unidad. Pega el valor en el conversor de TTL — detecta automáticamente segundos frente a milisegundos y marca exactamente este error.
  • No confíes en el momento de la eliminación. Pueden pasar unos pocos días entre la caducidad y la eliminación. Si "desaparecido en el instante en que caduca" importa, filtra por el atributo en las lecturas; no asumas que la fila se ha ido físicamente.
  • Las eliminaciones por TTL aparecen en Streams. Una eliminación por TTL emite un registro de flujo marcado como generado por el sistema — el gancho estándar para archivar eventos que caducan a S3 antes de que desaparezcan. Mira DynamoDB Streams.
  • Las eliminaciones por TTL también afectan a los . Eliminar un elemento también lo elimina de cualquier índice secundario en el que estuviera — que es la limpieza prevista, pero conviene saberlo si un índice alimentaba un recuento.

El TTL gestiona el final de la vida de un evento de forma barata. La siguiente pregunta es qué pagas por las escrituras en primer lugar — capacidad bajo demanda frente a aprovisionada.

Descarga DynoTable para inspeccionar los tipos de atributo de tus elementos y confirmar que tu atributo de TTL es un Number Unix-epoch antes de activar el TTL.

Actualizado