Día 4: Desplegando una Aplicación Web desde GitHub
🌐 Día 4: Desplegando tu Sitio Web desde GitHub
Hoy llevamos la automatización al siguiente nivel. En lugar de crear páginas HTML manualmente, clonaremos un repositorio Git y desplegaremos una aplicación web real. Así simulamos un flujo de trabajo profesional donde el código está versionado en GitHub.
¿Por qué es importante esto?
Esperar a que alguien suba archivos manualmente es lento y propenso a cambios perdidos. Usar Git nos permite:
- Descargar el código fuente directamente desde GitHub.
- Mantener el sitio sincronizado con cambios en el repositorio.
- Personalizar el contenido con scripts (sed, awk, etc.).
- Simular un pipeline CI/CD básico.
- Escalar aplicaciones web profesionales en minutos.
🛠️ El Código (CloudFormation)
Aquí está el UserData mejorado que clona un repositorio y lo despliega:
UserData: !Base64 |
#!/bin/bash
# Actualizar sistema
dnf update -y
# Instalar Nginx
dnf install nginx -y
# Iniciar y habilitar Nginx
systemctl start nginx
systemctl enable nginx
# Instalar git y clonar el repo
sudo dnf install git -y
git clone https://github.com/rsalgadoc/html5up-photon.git /tmp/mi-sitio
cd /tmp/mi-sitio
sed -i "s/<strong>Photon<\/strong>/<strong>$(hostname -f)<\/strong>/g" index.html
# Limpiar la carpeta de nginx y mover tus archivos
sudo rm -rf /usr/share/nginx/html/*
sudo cp -r /tmp/mi-sitio/* /usr/share/nginx/html/
# Reiniciar Nginx para aplicar cambios
systemctl restart nginx
📚 Conceptos Nuevos Explicados
1. git install - Instalar Git
Como cualquier otro software, necesitamos instalar Git primero:
dnf install git -y
Git es un controlador de versiones que permite descargar código desde repositorios.
2. git clone - Descargar un Repositorio
Clone copia un repositorio completo desde GitHub a tu sistema local:
git clone https://github.com/usuario/repositorio.git /ruta/destino
En nuestro caso:
git clone https://github.com/rsalgadoc/html5up-photon.git /tmp/mi-sitio
Esto descarga el theme “Photon” (una plantilla HTML5 profesional) a /tmp/mi-sitio.
Ventaja: No necesitas mantener archivos HTML. El código está siempre sincronizado con GitHub.
3. cd - Cambiar Directorio
Movemos a la carpeta del repositorio descargado:
cd /tmp/mi-sitio
Ahora cualquier comando se ejecutará dentro de esta carpeta.
4. sed - Buscar y Reemplazar
sed (Stream Editor) nos permite modificar archivos con expresiones regulares:
sed -i "s/BUSCAR/REEMPLAZAR/g" archivo.html
Desglose:
-i: Modifica el archivo “in-place” (en el mismo lugar)s: Sustituye (search and replace)g: Global (reemplaza todas las ocurrencias, no solo la primera)
En nuestro caso:
sed -i "s/<strong>Photon<\/strong>/<strong>$(hostname -f)<\/strong>/g" index.html
Esto reemplaza el texto “Photon” por el nombre de la instancia EC2. Así cada servidor muestra su propio nombre.
5. rm -rf - Eliminar Recursivamente
Borra directorios completos con todo su contenido:
rm -rf /ruta/directorio
-r: Recursivo (borra también subcarpetas)-f: Force (no pide confirmación)
En nuestro caso:
sudo rm -rf /usr/share/nginx/html/*
Limpia la carpeta por defecto de Nginx (/usr/share/nginx/html/).
⚠️ Cuidado: rm -rf es destructivo. Asegúrate de saber qué estás borrando.
6. cp -r - Copiar Recursivamente
Copia directorios completos:
cp -r /origen/* /destino/
-r: Recursivo (copia también subcarpetas)/*: El asterisco significa “todo lo dentro de esta carpeta”
En nuestro caso:
sudo cp -r /tmp/mi-sitio/* /usr/share/nginx/html/
Copia el sitio clonado a la carpeta de Nginx.
🚀 Cómo Desplegarlo
Guarda el código como 12-ec2-git-clone-site.yaml.
aws cloudformation create-stack \
--stack-name Mi-Sitio-Web \
--template-body file://12-ec2-git-clone-site.yaml
Especifica los parámetros:
aws cloudformation create-stack \
--stack-name Mi-Sitio-Web \
--template-body file://12-ec2-git-clone-site.yaml \
--parameters \
ParameterKey=Environment,ParameterValue=dev \
ParameterKey=VpcId,ParameterValue=vpc-xxxxx \
ParameterKey=SubnetId,ParameterValue=subnet-xxxxx
Una vez desplegado, visita en tu navegador:
http://<IP-ELASTICA>
Deberías ver un sitio web profesional (Photon theme) con el nombre de la instancia personalizado en el encabezado.
Modelo Production-Ready: Puedes:
- Cambiar el repositorio a tu propio código
- Agregar más comandos sed para personalizar contenido
- Ejecutar comandos de build (npm install, python setup, etc.)
📂 Código Adjunto
Puedes encontrar el template completo en mi repositorio: Ver archivo en GitHub
🎥 Video Tutorial
Mira el proceso paso a paso en video:
💡 Próximos pasos
- Observabilidad - Alarmas y Dashboards con CloudWatch