DynamoDB TTL
Tags: aws, dynamodb, python
Published: 2021-12-06 19:43:39

Vamos a utilizar DynamoDB para el manejo de la sesión de una aplicación Web en Python.

Lo primero que debemos hacer es crear la tabla en la cual vamos a tener los datos de la sesión.

```
dynamodb.create_table(
        TableName='ManejoSesion',
        KeySchema=[
            {
                'AttributeName': 'Sesion_Id',
                'KeyType': 'HASH'  # Partition key
            }
        ],
        #Se deben crear las llaves nuevamente con su tipo de dato
        AttributeDefinitions=[
            {
                'AttributeName': 'Sesion_Id',
                'AttributeType': 'S'  # Se utiliza S para tipos de datos String y N para numeros
            }

        ],
        ProvisionedThroughput={
            'ReadCapacityUnits': 5,
            'WriteCapacityUnits': 5
        }
    )

```
El siguiente paso es definir cuál atributo (columna) se va utilizar para que los registros sean borrados después del tiempo definido.

Para eso vamos a la consola de DynamoDB de la tabla creada y vamos al menu **Aditional Settings**.

![Aditional Settings]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/aditional%20settings.png)

Después buscamos la sección TTL y presionamos el botón **Enable**.

![TTL]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/TTL.png)

En la siguiente pantalla especificamos el nombre del atributo por el cual queremos que se borre el registro o la fila (**Expire_Session**). 

![Enable TTL]
(https://raw.githubusercontent.com/cecamilo00/posts/circleci-project-setup/enable%20TTL.png)

Para definir el tiempo de borrado vamos agregar un registro a la tabla en donde se va a definir la fecha de borrado (fecha actual + 5 minutos) para el registro en el campo **Expire_Session** que acabamos de configurar.

```
from datetime import datetime
from datetime import timedelta
import boto3
import os
import uuid
from decimal import Decimal

dynamo = boto3.resource("dynamodb")
tabla = dynamo.Table("ManejoSesion")

def obtener_vencimiento_sesion():
    hora_fin_sesion = datetime.now() + timedelta(minutes = 5)
    return Decimal(round(hora_fin_sesion.timestamp(),0))

sesion_id = uuid.uuid4().hex
sesion ={
        "Sesion_Id":str(sesion_id),
        "Expire_Session":obtener_vencimiento_sesion()
}
tabla.put_item(Item=sesion)

```
De esta forma hemos definido que el registro se va a borrar 5 minutos después de la fecha actual. Es importante tener en cuenta que pasados los 5 minutos aun vamos a ver el registro en nuestra tabla. De acuerdo a la documentación, DynamoDb ejecuta un proceso en segundo plano para eliminar estos registros y este proceso puede llegar a tardar 48 horas.

En caso que necesitemos obtener los registros que aun no se les ha vencido la fecha de borrado podemos hacer una consulta de este tipo:

```
hora = Decimal(round(datetime.now().timestamp(),0))
tabla.query(KeyConditionExpression=Key("Sesion_Id").eq("b05ce2de320a4cddbcc1fa64400d14c9"),
FilterExpression= 'Expire_Session >= :Expire_Session' ,
    ExpressionAttributeValues= { 
        ':Expire_Session': hora
    })
```



# Referencias
[DynamoDb TTL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html)

Me pueden encontrar en

[Camilo Cabrales](https://www.linkedin.com/in/camilo-cabrales-31a0bb53/)