Proyecto completo de infraestructura AWS como código (IaC) que demuestra las mejores prácticas de DevOps moderno. Este laboratorio implementa una aplicación web Python/Flask containerizada desplegada en Amazon EKS con un pipeline CI/CD completo, monitorización integrada y alta disponibilidad.
Objetivo principal: Demostrar competencias técnicas en infraestructura cloud, automatización, contenedores y prácticas DevOps para entornos de producción empresarial.
┌─────────────────────────────────────────────────────────────────┐
│ AWS Cloud (eu-west-1) │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ VPC (10.0.0.0/16) │ │
│ │ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ Public │ │ Public │ │ Public │ │ │
│ │ │ Subnet │ │ Subnet │ │ Subnet │ │ │
│ │ │ AZ-1 │ │ AZ-2 │ │ AZ-3 │ │ │
│ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │
│ │ │ │ │ │ │
│ │ ┌──────▼──────────────────▼──────────────────▼───────┐ │ │
│ │ │ Amazon EKS Cluster │ │ │
│ │ │ ┌─────────────────────────────────────────────┐ │ │ │
│ │ │ │ Worker Nodes (Auto Scaling Group) │ │ │ │
│ │ │ │ - Flask App (Pods) │ │ │ │
│ │ │ │ - Prometheus │ │ │ │
│ │ │ │ - Grafana │ │ │ │
│ │ │ └─────────────────────────────────────────────┘ │ │ │
│ │ └───────────────────────────────────────────────────┘ │ │
│ │ │ │ │ │ │
│ │ ┌──────▼───────┐ ┌──────▼───────┐ ┌──────▼───────┐ │ │
│ │ │ Private │ │ Private │ │ Private │ │ │
│ │ │ Subnet │ │ Subnet │ │ Subnet │ │ │
│ │ │ AZ-1 │ │ AZ-2 │ │ AZ-3 │ │ │
│ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │
│ │ │ │ │ │ │
│ │ └──────────────────┼──────────────────┘ │ │
│ │ │ │ │
│ │ ┌──────▼───────┐ │ │
│ │ │ RDS MySQL │ │ │
│ │ │ Multi-AZ │ │ │
│ │ └──────────────┘ │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
│ │ Amazon ECR │ │ Amazon S3 │ │ CloudWatch │ │
│ │ (Docker Images)│ │ (Terraform │ │ (Logs/Metrics)│ │
│ │ │ │ State) │ │ │ │
│ └────────────────┘ └────────────────┘ └────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
aws-terraform-devops-lab/
│
├── terraform/ # Infraestructura AWS
│ ├── main.tf # Orquestación de módulos
│ ├── variables.tf # Variables de entrada
│ ├── outputs.tf # Salidas de recursos
│ ├── providers.tf # Configuración de providers
│ └── backend.tf # Backend S3 para estado remoto
│
├── modules/ # Módulos Terraform reutilizables
│ ├── vpc/ # Red VPC multi-AZ
│ ├── eks/ # Cluster EKS + Node Groups
│ ├── rds/ # Base de datos RDS MySQL
│ ├── ecr/ # Registro Docker privado
│ ├── s3_bucket/ # Buckets S3 con cifrado
│ ├── iam/ # Roles y políticas IAM
│ └── cloudwatch/ # Log Groups y alarmas
│
├── environments/ # Configuración por entorno
│ ├── dev/
│ │ └── terraform.tfvars # Variables para desarrollo
│ └── prod/
│ └── terraform.tfvars # Variables para producción
│
├── docker/ # Aplicación containerizada
│ ├── Dockerfile # Multi-stage build
│ ├── requirements.txt # Dependencias Python
│ └── src/
│ ├── app.py # Aplicación Flask
│ └── tests/ # Tests unitarios (pytest)
│
├── kubernetes/ # Manifiestos K8s nativos
│ ├── namespace.yaml # Namespace aislado
│ ├── deployment.yaml # Deployment de aplicación
│ ├── service.yaml # Service tipo LoadBalancer
│ └── hpa.yaml # Horizontal Pod Autoscaler
│
├── helm/ # Helm Charts
│ └── webapp/
│ ├── Chart.yaml # Metadata del chart
│ ├── values.yaml # Valores por defecto
│ ├── values-dev.yaml # Override para dev
│ ├── values-prod.yaml # Override para prod
│ └── templates/ # Plantillas Kubernetes
│
├── argocd/ # GitOps con ArgoCD
│ └── apps/
│ └── webapp.yaml # Definición de Application
│
├── ansible/ # Automatización post-despliegue
│ ├── inventory/
│ │ └── hosts.ini # Inventario dinámico
│ └── playbooks/
│ └── configure-eks-nodes.yml # Configuración de nodos
│
├── monitoring/ # Stack de monitorización
│ ├── prometheus-values.yaml # Configuración Prometheus
│ └── install.sh # Script de instalación
│
├── scripts/ # Scripts de utilidad
│ ├── check_infra.py # Validación de infraestructura
│ └── tests/ # Tests de scripts
│
├── .github/
│ └── workflows/
│ └── ci-cd.yml # Pipeline GitHub Actions
│
├── Jenkinsfile # Pipeline alternativo Jenkins
├── sonar-project.properties # Configuración SonarCloud
└── README.md # Este archivo
aws configure
# AWS Access Key ID: [tu-access-key]
# AWS Secret Access Key: [tu-secret-key]
# Default region name: eu-west-1
# Default output format: json
export AWS_DEFAULT_REGION=eu-west-1
export TF_VAR_environment=dev
git clone https://github.com/Liquenson/aws-terraform-devops-lab.git
cd aws-terraform-devops-lab
cd terraform
# Crear bucket S3 para estado remoto (primera vez)
aws s3 mb s3://tfstate-devops-lab-rliquenson-euw1 --region eu-west-1
# Habilitar versionado
aws s3api put-bucket-versioning \
--bucket tfstate-devops-lab-rliquenson-euw1 \
--versioning-configuration Status=Enabled
# Actualizar backend.tf con el nombre de tu bucket
# Inicializar Terraform
terraform init
# Seleccionar workspace (dev/prod)
terraform workspace new dev
terraform workspace select dev
# Planificar cambios
terraform plan -var-file=../environments/dev/terraform.tfvars
# Aplicar infraestructura
terraform apply -var-file=../environments/dev/terraform.tfvars -auto-approve
# Actualizar kubeconfig
aws eks update-kubeconfig \
--region eu-west-1 \
--name devops-lab-eks-dev
# Verificar conectividad
kubectl get nodes
kubectl get namespaces
cd ../helm
# Instalar chart de aplicación
helm install webapp ./webapp \
-f ./webapp/values-dev.yaml \
--namespace webapp \
--create-namespace
# Verificar deployment
kubectl get pods -n webapp
kubectl get svc -n webapp
cd ../monitoring
# Instalar Prometheus + Grafana
chmod +x install.sh
./install.sh
# Obtener credenciales de Grafana
kubectl get secret -n monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode
El proyecto implementa un pipeline completo de CI/CD con GitHub Actions:
┌─────────────┐
│ git push │
└──────┬──────┘
│
▼
┌─────────────────────────────────────────┐
│ GitHub Actions Workflow (.github/) │
├─────────────────────────────────────────┤
│ │
│ 1️⃣ Checkout código │
│ 2️⃣ Setup Python 3.11 │
│ 3️⃣ Instalar dependencias │
│ 4️⃣ Linting (flake8) │
│ 5️⃣ Tests unitarios (pytest) │
│ 6️⃣ Cobertura de código │
│ 7️⃣ SonarCloud Analysis │
│ 8️⃣ Build Docker Image │
│ 9️⃣ Push to Amazon ECR │
│ 🔟 Deploy to EKS (solo en tags) │
│ │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ SonarCloud Quality Gate │
│ ✅ Security Rating: A │
│ ✅ No vulnerabilities │
│ ✅ Code Coverage > 80% │
└─────────────────────────────────────────┘
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
SONAR_TOKEN
http://<load-balancer>:9090http://<load-balancer>:3000admin✅ SonarCloud Quality Gate: Security Rating A sin vulnerabilidades
✅ IAM Least Privilege: Roles específicos para cada servicio
✅ Secrets Management: Variables sensibles en GitHub Secrets
✅ Network Isolation: Subnets privadas para bases de datos
✅ Encryption at Rest: RDS y S3 con cifrado habilitado
✅ Encryption in Transit: TLS/SSL en todos los endpoints
✅ Security Groups: Reglas de firewall restrictivas
✅ No hardcoded credentials: Credenciales fuera del código fuente
cd docker
# Ejecutar tests
pytest src/tests/ -v
# Con cobertura
pytest src/tests/ --cov=src --cov-report=html
# Abrir reporte
open htmlcov/index.html
cd scripts
# Verificar recursos AWS
python check_infra.py --environment dev
# Ejecutar tests del script
pytest tests/ -v
# Python
flake8 docker/src/ --max-line-length=120
# Terraform
terraform fmt -check -recursive terraform/
terraform validate
Liquenson Rubén
DevOps Engineer || Cloud & Linux Administrator || AWS || Kubernetes
Este proyecto es de código abierto bajo la licencia MIT. Ver archivo LICENSE para más detalles.
Este proyecto fue creado como demostración de competencias DevOps para procesos de selección profesional, implementando las mejores prácticas de la industria y siguiendo los estándares de AWS Well-Architected Framework.
Stack tecnológico inspirado en: AWS Solutions Architecture.
⭐ Si este proyecto te resulta útil, considera darle una estrella en GitHub!