DynamoDB TTL

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.

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

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

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

Me pueden encontrar en

15