15
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
})
Me pueden encontrar en
15