
En este proyecto vamos a hacer algo muy parecido a una aplicación del mundo real: una app completa en Java que tenga su frontend, su backend y su base de datos. Nada de “Hello World”. La idea es mostrar el proceso completo, desde el código hasta que se puede abrir en un navegador. Y para eso vamos a usar varias herramientas, con AWS como base por su puesto.
Todo parte con el código fuente que ya tenemos en GitHub. Lo primero que haremos será clonar ese repositorio en una instancia EC2 de AWS. Allí vamos a preparar el entorno instalando Apache Maven y el JDK para poder compilar y empaquetar nuestra app en un archivo .jar
.
Una vez que tenemos ese archivo .jar
, la idea es containerizarlo (si es que se dice así). Para eso, creamos una imagen Docker y la subimos a un repositorio privado en AWS ECR (Elastic Container Registry), que es el servicio de Amazon para guardar imágenes de contenedores.
Antes de desplegar, pasamos la imagen por Trivy, una herramienta súper útil que escanea la imagen en busca de vulnerabilidades de seguridad. Es como un chequeo rápido para asegurarnos que no estamos subiendo nada que no de deba.
Y finalmente, el objetivo de esto: vamos a levantar un contenedor Docker con esa imagen y accederemos a nuestra app desde el navegador. Todo esto sucede dentro de la nube, en infraestructura controlada por nosotros. Todo sencillito.
¿Que necesitamos?, Para empezar, una instancia EC2 t2.large por lo mínimo. Costo por hora: entre 1 y 1.5 dólares.
Asegurate de que tenga una dirección ip pública.
Ingresamos a la VM por ssh.
Instalamos maven, java, docker y trivy.
Por acá les dejo los comandos necesarios para instalarlos en Ubuntu Linux
-- Instalar Maven y JDK -- sudo apt-get update -y sudo apt install openjdk-11-jre -y sudo apt-get install maven -y --- Instalar Docker --- sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y sudo usermod -aG docker $USER newgrp docker sudo chmod 666 /var/run/docker.sock sudo systemctl restart docker --- Instalacion de Tivy --- sudo apt-get install wget apt-transport-https gnupg lsb-release -y wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | gpg --dearmor | sudo tee /usr/share/keyrings/trivy.gpg > /dev/null echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list sudo apt-get update && sudo apt-get install trivy -y --- Instalacion de AWS CLI --- curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" sudo apt install unzip unzip awscliv2.zip sudo ./aws/install
Volvemos a AWS
Asegurarse de que el usuario IAM tenga el siguiente permiso:

Crear una Access Key si aun no la tiene.
En la instancia EC2.
aws configure
-> ingresa las credenciales
-> asegurarse de la región donde se esta implementando sea la misma del ECR
-> formato de salida: json
Ir a AWS ECR
Crear
Dale un nombre
Todo lo demás por defecto -> crear
Seleccionar el repositorio creado -> view push commands.
Debemos asegurarnos de estar autenticados en nuestro Docker Registry.
-> Registry Autenication.

Debemos ejecutar el comando To authenticate with the Amazon ECR HTTP API el que comienza por TOKEN=$

Lo copiamos.
Vamos a la instancia EC2 y ejecutamos el comando copiado
Volvemos a ECR
Copiamos el primer comando que dice Retrieve an authentication token and authenticate your Docker client to your registry. Use the AWS CLI:
Vamos a EC2 pegamos y ejecutamos.
Debe mostrar un mensaje de Login Success
De el lado de AWS hemos configurado todo.
Lo siguiente es clonar la aplicacion desde Github con git clone en la VM.
https://github.com/richardaguirre1/Ekart.git
En caso de que sea un repositorio privado, ingresar las credenciales.
Una vez clonado la aplicacion en la vm procedemos a compilar y construir la aplicacon.
Dentro de la carpeta de la aplicacion se encuentran varios archivos y carpetas, entre ellos, pom.xml
Utilizando maven compilaremos la aplicacion
mvn clean compile
Finalizada la compilacion sin errores se procede a construir la aplicación.
mvn clean package -DskipTests=true #(este ultimo parámetro se utiliza en caso de querer omitir los casos de pruebas).

Se crea una carpeta target y dentro el archivo.

Ahora, desde la carpeta de la aplicacion crearemos la imagen Docker
Verificar que el Dockerfile se encuentre dentro de la carpeta docker y que tenga los comandos correspondientes.
docker build -t image1 -f docker/Dockerfile .
verificamos que la imagen docker este en el directorio.
docker images

Lo siguiente seria etiquetar la imagen docker con el comando proporcionado por aws sustituyendo el nombre sugerido por el de nuestra imagen.

Si ejecutamos un docker images veremos dos imágenes. La segunda no podemos enviarla a nuestro ECR debido a la convención de nomenclatura. Así que la primera tiene el nombre correcto.
Ahora debemos hacer un push con el comando proporcionado por aws
docker push …..

Luego de finalizado, vamos a nuestro Repositorio y podemos ver nuestra imagen disponible.
Ejecutar la aplicación y acceder a ella a traves del navegador.
docker run -d --name Ekart-server -p 8070:8070 202533544818.dkr.ecr.us-east-1.amazonaws.com/cicdpipelineaws
Con este comando tendremos ejecutada la aplicacion y nos proporciona una id
Para comprobarlo, colocamos la ip publica del servidor en la instancia ec2 seguido del puerto que le asignamos, en este caso el 8070
Por ejemplo: 43.204.234.16:8070
Comprobar
Esta aplicación tiene lo necesario, un frontend, un backend y una base de datos y funciona todo según lo esperado.
Adicional si queremos asignar la dirección ip a un subdominio
Debemos registrarlo en Route 53 (si ya lo tienen configurado ) y agregar un “A Record”.

Una vez propagado el DNS en unos pocos segndos, a veces unos pocos minutos, procedemos a ingresar por la url dev.richardaguirre.cloud:8070
Por otra parte si lo que queremos es que el usuario no ingrese el numero de puerto, en este caso el 8070, lo que podemos es instalar un proxy reverso y eso lo hacemos en el servidor con nginx
Entonces en nuestro servidor instalamos Nginx.
sudo apt update && sudo apt install nginx -y
damos este permiso para el trafico http
sudo ufw allow 'Nginx Full'
Editamos la configuración de Nginx
sudo nano /etc/nginx/sites-available/default
y dentro dejamos solo esto que es lo necesario.
server { listen 80; server_name dev.richardaguirre.cloud; location / { proxy_pass http://localhost:8070; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
Recuerda sustituir el nombre de dominio por el tuyo
Reiniciamos el servicio de nginx.-
sudo systemctl restart nginx
Volvemos al navegador web y listo
http://dev.TU_DOMINIO.com
En caso de que quieras tener todo dockerizado en el servidor, averigua como ejecutar Nginx en Docker por tu cuenta. Podés usar ChatGPT para que te ayude.
Si has llegado hasta acá y te preguntas ¿Para que instalé Trivy y no lo usé?. Esa es una excelente pregunta.
Trivy es una herramienta muy útil para escanear vulnerabilidades en contenedores, imágenes Docker, archivos Dockerfile
, repositorios de código fuente, y más. Ideal para integrarla en una pipeline CI/CD.
Comando básico
trivy image nombre-de-la-imagen
En este proyecto podríamos ejecutar Trivy luego del docker build y antes del despliegue.