Por: Gerardo Canedo.
Colaboradores: Matias Maldonado y Nicolás Cheda.
Introducción
Hace poco me solicitaron ayuda para desplegar una aplicación construida de forma honoraria para una ONG. Para que esta aplicación sea realmente de utilidad, debe encontrarse en producción, y para esto me solicitaron ayuda.
Un aspecto nada menor al desplegar un sistema en producción es la administración. Luego de desplegado, no termina allí el trabajo. Una serie de tareas deben ser realizadas periódicamente, además de las urgencias (que suelen ser los sábados de noche) que eventualmente surgen. Caídas del sistema, gestión de certificados, actualización de software base, problemas de conectividad, rotación de logs y otros tantos más son comunes en la operación de un sistema.
En otro proyecto utilizamos el servicio Lambda en la nube de Amazon (AWS) para auto escalar en ciertos picos de demanda, y funcionó muy bien. En este caso, en vez de escalar, me atrae mucho la idea de pagar por lo que se utiliza. Esta aplicación no se utilizará masivamente, y si su ejecución genera poco gasto para la ONG, es un punto a favor.
Además de Lambda, AWS posee el servicio Fargate: una solución para ejecutar contenedores Docker sin servidor de base (serverless). Como necesito manejar la sesión de los usuarios para esta aplicación web, Fargate es la pieza de construcción correcta.
En este post contaré mi experiencia desplegando una aplicación web desarrollada con GeneXus (generador Java) y utilizando como DMBS PostgresSQL.
Objetivos
Los objetivos perseguidos son los siguientes:
- Minimizar la necesidad de ejecutar tareas manuales durante la operación del sistema.
- Realizar un despliegue seguro: Cumplir con el nivel 1 de los requerimientos del OWASP ASVS, en particular en los puntos V9 (Verificación de requerimientos de comunicación ) y V14 (Verificación de requerimientos de configuración).
- Obtener experiencia en infraestructura como código. Utilizando el cloud development kit (cdk) de Amazon, generar la infraestructura y todo activo posible de forma programática (no utilizar el sitio de AWS para configurar el despliegue). El objetivo secundario es poder generar distintos ambientes del ciclo de desarrollo de forma automática y reutilizar el conocimiento para otros proyectos.
- Minimizar los costos de operación. De cobrarse la infraestructura en función a su uso, el costo debería de ser bajo.
- El usuario final debe de poder acceder a una url dentro del propio dominio de la organización. El despliegue debe ubicarse en una url del estilo https://sistema.dominio.com. No es aceptable poseer una url generada por la nube y para nada amistosa para un usuario final.
- Generar experiencia en el despliegue de aplicaciones web generadas con GeneXus en contextos serverless en la nube.
Diagrama de la solución
VPC (Virtual Private Cloud): Amazon Virtual Private Cloud (Amazon VPC) le permite lanzar recursos de AWS en una red virtual que haya definido. Esta red virtual es muy similar a la red tradicional que usaría en su propio centro de datos, pero con los beneficios que supone utilizar la infraestructura escalable de AWS.
ECS Cluster (Fargate): AWS Fargate es «un motor informático sin servidor que funciona tanto con Amazon Elastic Container Service (ECS)». Permite desplegar contenedores y gestionarlos sin tener que configurar o administrar la infraestructura base.
ECR: AWS Elastic Container Registry es un registro de imágenes de contenedores. En este caso de uso en particular, se utiliza para publicar desde el ambiente de desarrollo las imágenes docker generadas con la aplicación web y consumirla desde la nube. Este registro es de uso privado de este despliegue.
Database (RDS): RDS es el componente de la nube de AWS que implementa la gestión, aprovisionamiento y configuración de instancias de bases de datos. Permite contar con una instancia de base de datos sin la necesidad de poseer conocimiento para configurarla.
AWS Certificate manager: es el servicio de AWS que permite emitir y gestionar certificados digitales. Algo importante en este caso es que el dominio en cuestión ya existe de antemano y no fue migrado a la nube AWS.
DNS: DNS previamente existente.
Usuarios: Usuarios de la aplicación.
El código completo para desplegar la infraestructura así como una descripción técnica detallada de cada paso se puede encontrar en el Github de GeneXus Consuting.