Proyecto AWS: Desplegar Bot de WhatsApp con Kubernetes y EKS

Índice
En este nuevo proyecto de AWS, vamos a desplegar un ChatBot de WhatsApp desarrollado en nodejs, además de un pequeño frontend con Angular para administrar el contenido de las opciones y las alertas.
Adicionalmente, vamos a disponer de una base de datos en PostgreSQL para almacenar el texto de cada mensaje y las alertas que el sistema va a generar. Está la deberemos crear de forma externa, y nos conectaremos de forma remota posteriormente (en este proyecto no se contempla añadir la BD dentro del cluster, sin embargo puede ser perfectamente adaptada).
Repositorio
En el siguiente link se encuentra disponible el código completo de la aplicación. Este será usado para el despliegue en AWS.
Repositorio en GitHub: https://github.com/brunodangelo/aws-eks-bot-whatsapp-kubernetes
Descripción de cada carpeta
- back-node: Backend desarrollado en nodejs, con el framework express
- bot-node: Proceso del chatbot de WhatsApp desarrollado en nodejs, con la libreria open-source BuilderBot
- front-prod: Frontend de autogestión desarrolado en Angular (se utiliza como base la plantilla free “nice-admin-angular-lite”)
- k8s: manifiestos .yaml para el despliegue utilizando kubernetes
- scripts bash: archivos para automatizar la creacion de las imagenes y los contenedores para el despliegue local con Docker
Arquitectura
Diseño y los servicios de AWS a emplear:

Disponemos de 3 pods en los que se encuentran el proceso del Bot (bot-node), el Backend (back-node) y el Frontend (bot-front). Estos se encuentran dentro del mismo cluster y el servicio asociado que poseen es Load Balancer.
Subir imágenes a ECR
Debemos subir las imágenes creadas a partir de cada Dockerfile a ECR:
IMPORTANTE: Al momento de crear las imágenes, pasar por variables de entorno las credenciales de acceso a la BD remota.

Pruebas en local con Docker
Si se quiere probar localmente, utilizando contenedores docker se pueden correr los scripts de Bash:
- Ejecutar script en Bash llamado “1-creacion-imagenes.sh” para crear las imagenes de Docker a partir del codigo de cada modulo
- Ejecutar script en Bash llamado “2-creacion-contenedores-despliegue-local.sh” para crear los contenedores y la red que los agrupa
Pruebas en local con Minikube
Ejecutar el siguiente comando en la consola local (crea un secret para obtener las imagenes desde ECR):
kubectl create secret docker-registry ecr-secret \
--docker-server=<id_cuenta>.dkr.ecr.us-east-1.amazonaws.com \
--docker-username=AWS \
--docker-password=$(aws ecr get-login-password --region us-east-1) \
--namespace default
Reemplazar en “image”, dentro de cada deployment.yaml localizados en la carpeta “k8s”, el valor por la URI de la imagen en ECR.
Ejecutar los siguientes comandos para la creación de los deployments y los servicios (posicionarse en k8s):
minikube start
kubectl apply -f back-node/deployment-back-node.yaml
kubectl apply -f back-node/service-back-node.yaml
kubectl apply -f bot-node/deployment-bot-node.yaml
kubectl apply -f bot-node/service-bot-node.yaml
kubectl apply -f bot-front/deployment-bot-front.yaml
kubectl apply -f bot-front/service-bot-front.yaml
Una vez finalizado, asegurate que todos los deployments esten con el estado READY:

Finalmente, para eliminar todo luego de realizar las pruebas, ejecuta los siguientes comandos:
minikube stop
minikube delete
Despliegue en EKS
Primeramente, debes tener ya instalado AWS-CLI con su respectiva configuración de credenciales.
En este proyecto, vamos a utilizar eksctl para el despliegue a través de la terminal, por lo que debes también instalarlo en tu computadora. Sin embargo, si quieres también puedes hacer los pasos desde la interfaz grafica de AWS o con alguna herramienta de IaC como Terraform.
Paso 1: Creación del Cluster
eksctl create cluster --name bot-cluster --region us-east-1 --without-nodegroup
Paso 2: Creación del node-group
eksctl create nodegroup --cluster bot-cluster --nodes-min 1 --nodes-max 5 --nodes 2 --name autoscaling-nodegroup --node-type t3.medium --region us-east-1
Debemos aguardar unos minutos hasta que todo quede correctamente creado y configurado.
Luego, podremos lo siguiente desde la interfaz de AWS:

Ahora lo que debemos hacer es crear los deployments y servicios ya dentro de los recursos de AWS.
Paso 3: Cambiar de entorno en la consola
aws eks update-kubeconfig --region us-east-1 --name bot-cluster
Paso 4: Crear los pods y servicios de kubernetes en los recursos creados en EKS (para BACK-NODE y BOT-NODE) IMPORTANTE: UBICARSE EN /k8s
kubectl apply -f back-node/deployment-back-node.yaml
kubectl apply -f back-node/service-back-node.yaml
kubectl apply -f bot-node/deployment-bot-node.yaml
kubectl apply -f bot-node/service-bot-node.yaml
Paso 5: Dentro de deployment-bot-front.yaml, cambiar las variables de entorno API_BACK y API_BOT por las direcciones dns de los Load Balancer que ha creado AWS en el paso anterior

Paso 6: Crear los pods y servicios de kubernetes para BOT-FRONT
kubectl apply -f bot-front/deployment-bot-front.yaml
kubectl apply -f bot-front/service-bot-front.yaml
Paso 7: Acceder a la url del Frontend (bot-front):

Veremos la siguiente web:

Final
Una vez desplegada la aplicación completa, solamente debemos escanear el codigo QR desde la interfaz grafica del frontend y el proceso del bot comenzará:

Una vez cumplido este paso, ya el bot comienza a responder al usuario:

Última actualización el 01-04-2025 por Bruno D’Angelo