Tengo una tabla de dynamodb con casi 200 000 elementos. Necesito activar una lambda para cada elemento que contiene (enviar cada elemento a lambda como entrada). Quiero realizar esto cada x horas para todos los elementos de la tabla. Los datos en la tabla cambian cada 5 días más o menos.
¿Hay alguna forma sin servidor de automatizar la obtención de todos los elementos en lambda a través de SQS, etc.?
No puedo tener un lambda para escanear toda la tabla, ya que es demasiado para que un lambda lo maneje (dado el límite de 300 segundos, etc.).
Gracias, Vinod.
Tanto escanear como cambiar todos los datos en Dynamodb no son factibles.
Puede mantener todas las claves de dynamodb en un caché como redis. Puede haber un trabajo separado que tome las claves de redis y las coloque en sqs, donde lambda está escuchando. Las claves redis se pueden mantener actualizadas mediante flujos de dynamodb.
Dynamo no ofrece una buena manera de activar una lambda para los elementos que ya existen, pero hay algunas formas de abordar este problema:
Mencionó que le preocupaba que la lambda no tuviera suficientes recursos para escanear todos los elementos de la tabla; podría intentar operar con los datos en fragmentos más pequeños para evitar las limitaciones de recursos. Lambdas tiene un tiempo de ejecución máximo de 15 minutos, lo que debería ser suficiente para la mayoría de los trabajos. (Tenga en cuenta que en Lambda, la CPU se escala con la memoria, por lo que, según el trabajo, el aprovisionamiento de memoria podría ahorrarle dinero al reducir el tiempo que tarda la función en completarse).
En ECS con Fargate, puede crear tareas sin servidor en una programación cron. Si le preocupan los límites de recursos, puede aprovisionar hasta 4 vCPU y 32 GB de memoria por tarea, lo que hará que sea mucho menos probable que alcance el límite de recursos. Aquí hay alguna documentación sobre cómo configurar eso.
Puede configurar su tabla de dynamo para activar una lambda cada vez que se inserten , modifiquen o eliminen datos en la tabla, luego puede procesar elementos a medida que ingresan o cambian. Incluso puede configurarlo para cambios por lotes de hasta 10 elementos para reducir las invocaciones de lambda. Aquí hay un enlace a la documentación.
Nota: este método no se activa para elementos que ya están en la tabla. Sin embargo, puede evitar esto escribiendo un script para actualizar un campo arbitrario en esos elementos.Cuando dice que desea "disparar" para cada elemento, no está 100% claro a qué se refiere. En general, creo que DynamoDB transmite para eso, pero algo tiene que hacer que los registros sean procesados por la transmisión. Esto a menudo se hace con un elemento de UpdateItem simple para cada registro, configurando un campo, que probablemente no sea parte de sus datos, a algo como la hora actual o algo más único. A partir de ahí, obtendrá cada registro para procesar a través de un lambda activado en la transmisión.
La forma 100% sin servidor de recorrer los datos es la siguiente: