# Automatización carga de ciudades en DB La solución propuesta consiste en un proyecto *Serverless* que permite realizar la carga de ciudades mediante la actualización de archivos *JSON* que luego son procesados a modo de mantener los datos siempre sincronizados de manera transversal en *DynamoDB*, los *S3 Buckets* y las *DB SQL*. ## Problema actual Actualmente existen 3 orígenes de datos utilizados para la obtención de datos geográficos que son: - Tablas en *DynamoDB* - Tablas en las *DB SQL* - Archivos JSON en *S3 Buckets* Este modelo presenta los siguientes problemas: - Para realizar la actualización de datos es necesario modificar los 3 orígenes, permitiendo ingresar datos con errores en alguno de ellos durante el proceso. - Para hacer efectiva la modificación se requiere coordinar la publicación en los 3 destinos a modo de evitar la inconsistencia de datos, haciendo que sea un proceso engorroso y poco ágil. - En la publicación de archivos *JSON* en *S3* es necesario un procesamiento previo de los datos para generar pequeños archivos *JSON*, agrupando comunas por ciudades y ciudades por países. - No existe validación de datos de entrada ni de consistencia en el proceso de sincronización. Por ejemplo, para comprobar que una ciudad se ha ingresado duplicada o que los registros tienen datos diferentes en los orígenes (que ya ha sido causa de errores en el sistema). Actualmente hay algunos procesos que consiguen resultados similares con una mezcla de triggers *SQL* para modificación que ejecutan *Store procedures*, almacenamiento de datos en tablas intermedias que con la ayuda del monitoreo constante con procesos periódicos realizan las actualización de datos mediante endpoints, pero se pretende optimizar esos procesos de una manera mas efectiva siguiendo un enfoque *Cloud-First* aprovechando las herramientas que tenemos a dispocición. ## Solucion propuesta En el actual proyecto *Serverless* *afex-services* se utilizará 3 archivos *JSON* como *master* en los *seeds*, donde cada uno de ellos representa una tabla de las *DB*: - countries.json - cities.json - communes.json Para realizar una actualización se modifica los archivos necesarios y se publican. Esto se puede realizar publicando manualmente el archivo JSON en el *S3 Bucket* (por usuarios con los permisos necesarios en *AWS*) o por medio del *workflow* de *Github* de *CI/CD* una vez que se integran cambios al integrar una *Pull-request*. El flujo queda de la siguiente manera: 1. Se actualiza los archivos *JSON* en el *S3 Bucket*. 2. Por medio de un *S3 Trigger* se invoca a una función *Lambda*. 3. La función *Lambda* se encarga de: 3.1 Obtener archivos *JSON* actualizados desde el *S3 Bucket*. 3.2 Realizar validaciones de datos. 3.3 Por medio de *LambdasCore* se comunica con *AfexAPI*. 3.4 *AfexAPI* realiza los cambios en las *DB SQL*. 3.5 Actualiza los valores en las tablas *DynamoDB*. 3.6 Procesa archivos *master* para generar los pequeños archivos que representan las comunas de cada ciudad y las ciudades de cada país. 3.7 Publica achivos *JSON* generados en el *S3 Bucket*. 3.8 Generar logs para poder monitorear los cambios realizados. ## Plan de trabajo 1. Globalizar las tablas de datos geográficos en *DynamoDB* para: - countries - cities - communes 3. Crear *seeds* que representan a cada una de las tablas con los datos actualizados. 4. Crear función *Lambda* principal que se encargará de realizar todas las operaciones descritas previamente. 5. Generar el *S3 Trigger* para que ejecute la función lambda cuando se actualicen los archivos *master* en el *S3 Bucket*. 6. Crear funciones necesarias en proyecto *LambdasCore* para permitir la comunicación con *AfexAPI*. 7. Crear funciones necesarias en proyecto *AfexAPI* para ejecutar las operaciones requeridas que sincronizan los datos en las *DB SQL*. 8. Crear *workflow* en *Github* para *CI/CD* que permita la publicación de los archivos *master* en el *S3 Bucket* cuando se integra un *Pull-request* que considera la modificación de ellos. Es importante considerar que esto además nos permite realizar *rollbacks* de manera rápida y efectiva mediante la ejecución del *workflow* a una versión/tag expecífica. 9. Integrar con alguna herramienta que permita informar cuando se realiza la actualización de estos datos.