Conceptos FinOps
¿Qué es FinOps?
FinOps (Financial Operations) es una práctica cultural y una disciplina que maximiza el valor empresarial de la nube ayudando a los equipos de ingeniería, finanzas y negocio a colaborar en las decisiones de gasto en la nube.
┌─────────────────────────────────────────────────────────────┐
│ FINOPS - LAS 3 FASES │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1. INFORMAR 2. OPTIMIZAR │ │
│ │ ─────────── ─────────── │ │
│ │ • Visibilidad de costos • Dimensionamiento │ │
│ │ • Asignación • Reservas/Ahorros │ │
│ │ • Presupuestos • Instancias Spot │ │
│ │ • Pronósticos • Limpieza │ │
│ │ │ │
│ │ ↓ │ │
│ │ │ │
│ │ 3. OPERAR │ │
│ │ ───────── │ │
│ │ • Gobernanza │ │
│ │ • Automatización │ │
│ │ • Mejora continua │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
AWS Cost Explorer
Navegación y Análisis
┌─────────────────────────────────────────────────────────────┐
│ AWS COST EXPLORER │
├─────────────────────────────────────────────────────────────┤
│ │
│ VISTAS PRINCIPALES : │
│ │
│ 1. POR SERVICIO │
│ ┌─────────────────────────────────────────────────┐ │
│ │ EC2 ████████████████████ $1,200 (40%)│ │
│ │ RDS ██████████ $600 (20%) │ │
│ │ S3 ████████ $450 (15%) │ │
│ │ Lambda ██████ $300 (10%) │ │
│ │ Other █████ $450 (15%) │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ 2. POR TAG │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Env:Production ██████████████████ $2,100 │ │
│ │ Env:Staging ████████ $600 │ │
│ │ Env:Dev ████ $300 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ 3. POR CUENTA │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Prod Account ██████████████████ $2,100 │ │
│ │ Dev Account ████████ $600 │ │
│ │ Shared Services ████ $300 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Estrategia de Tagging
Tags Esenciales
┌─────────────────────────────────────────────────────────────┐
│ ESTRATEGIA DE TAGGING │
├─────────────────────────────────────────────────────────────┤
│ │
│ TAGS OBLIGATORIOS : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Tag Valores Ejemplo Propósito │ │
│ │ ─── ─────────────── ──────── │ │
│ │ Environment prod/staging/dev Entorno │ │
│ │ Project webapp/api/batch Proyecto │ │
│ │ Owner team-infra Responsable │ │
│ │ CostCenter CC-1234 Facturación │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ TAGS RECOMENDADOS : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Application nombre-aplicación Identificación│ │
│ │ CreatedBy terraform/console Trazabilidad │ │
│ │ ExpiryDate 2024-12-31 Limpieza │ │
│ │ Compliance pci/hipaa Cumplimiento │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ EJEMPLO COMPLETO : │
│ { │
│ "Environment": "production", │
│ "Project": "ecommerce-api", │
│ "Owner": "team-backend", │
│ "CostCenter": "CC-5678", │
│ "Application": "checkout-service", │
│ "CreatedBy": "terraform" │
│ } │
│ │
└─────────────────────────────────────────────────────────────┘
Aplicación de Tags
# AWS Config Rule para verificar los tags obligatorios
aws configservice put-config-rule \
--config-rule '{
"ConfigRuleName": "required-tags-ec2",
"Source": {
"Owner": "AWS",
"SourceIdentifier": "REQUIRED_TAGS"
},
"InputParameters": "{\"tag1Key\":\"Environment\",\"tag2Key\":\"Project\",\"tag3Key\":\"Owner\"}",
"Scope": {
"ComplianceResourceTypes": ["AWS::EC2::Instance"]
}
}'
Right-Sizing
Identificar Recursos Sobredimensionados
┌─────────────────────────────────────────────────────────────┐
│ RIGHT-SIZING │
├─────────────────────────────────────────────────────────────┤
│ │
│ MÉTRICAS A ANALIZAR : │
│ │
│ CPU Utilización promedio < 20% │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Instancia CPU Prom RAM Prom Recomendación │ │
│ │ ──────── ─────── ─────── ────────────── │ │
│ │ i-web1 15% 30% Reducir │ │
│ │ i-web2 45% 60% OK │ │
│ │ i-db1 80% 85% ¿Aumentar? │ │
│ │ i-batch 5% 10% Spot o más pequeña│ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ REGLAS GENERALES : │
│ │
│ CPU < 20% durante 14+ días → Candidato a downsizing │
│ CPU > 80% frecuentemente → Candidato a upsizing │
│ Memoria < 30% → Probable sobredimensionamiento │
│ │
│ AWS COMPUTE OPTIMIZER : │
│ Servicio gratuito que analiza automáticamente y │
│ recomienda los tipos de instancia adecuados │
│ │
└─────────────────────────────────────────────────────────────┘
Opciones de Pricing
Comparación
┌─────────────────────────────────────────────────────────────┐
│ OPCIONES DE PRICING EC2 │
├─────────────────────────────────────────────────────────────┤
│ │
│ TIPO AHORRO COMPROMISO CASO DE USO │
│ ──── ──────── ────────── ─────────── │
│ │
│ On-Demand 0% Ninguno Dev, pruebas │
│ (a demanda) Picos imprev. │
│ │
│ Reserved (RI) 30-60% 1-3 años Producción │
│ Standard Tipo fijo estable │
│ │
│ Reserved (RI) 20-40% 1-3 años Producción │
│ Convertible Flexible evolutiva │
│ │
│ Savings Plans 30-50% 1-3 años Compute │
│ Compute Flexible multi-servicio │
│ │
│ Spot 60-90% Ninguno Batch, CI/CD │
│ Instances Interrumpible Tolerante │
│ │
│ EJEMPLO DE AHORRO ANUAL (m5.large en us-east-1) : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ On-Demand : $0.096/h × 8760h = $840/año │ │
│ │ 1yr RI : $0.060/h × 8760h = $525/año (-37%) │ │
│ │ 3yr RI : $0.040/h × 8760h = $350/año (-58%) │ │
│ │ Spot : ~$0.030/h × 8760h = $263/año (-69%) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Limpieza de Recursos
Recursos Frecuentemente Olvidados
┌─────────────────────────────────────────────────────────────┐
│ RECURSOS HUÉRFANOS │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. EBS VOLUMES NO ADJUNTOS │
│ aws ec2 describe-volumes \ │
│ --filters Name=status,Values=available │
│ → Eliminar o snapshot y eliminar │
│ │
│ 2. ELASTIC IPs NO UTILIZADAS │
│ aws ec2 describe-addresses \ │
│ --filters Name=association-id,Values="" │
│ → Costo : $3.65/mes si no está adjunta │
│ │
│ 3. SNAPSHOTS ANTIGUOS │
│ aws ec2 describe-snapshots --owner-ids self \ │
│ --query 'Snapshots[?StartTime<`2023-01-01`]' │
│ → Evaluar y eliminar los obsoletos │
│ │
│ 4. OLD AMIs │
│ Conservar solo las N últimas versiones │
│ │
│ 5. LOAD BALANCERS INUTILIZADOS │
│ ALB/NLB sin targets │
│ → Costo fijo incluso sin tráfico │
│ │
│ 6. NAT GATEWAYS SUBUTILIZADAS │
│ → $32/mes mínimo + datos │
│ Considerar NAT Instance para dev │
│ │
│ 7. RDS INSTANCIAS DETENIDAS │
│ ⚠️ Se reinician automáticamente después de 7 días │
│ → Snapshot y eliminar si no se necesita │
│ │
└─────────────────────────────────────────────────────────────┘
Script de Limpieza
#!/bin/bash
# cleanup-orphans.sh
echo "=== Búsqueda de recursos huérfanos ==="
echo -e "\n1. EBS Volumes no adjuntos:"
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query 'Volumes[*].[VolumeId,Size,CreateTime]' \
--output table
echo -e "\n2. Elastic IPs no utilizadas:"
aws ec2 describe-addresses \
--query 'Addresses[?AssociationId==null].[PublicIp,AllocationId]' \
--output table
echo -e "\n3. Snapshots > 90 días:"
NINETY_DAYS_AGO=$(date -d '90 days ago' '+%Y-%m-%d')
aws ec2 describe-snapshots --owner-ids self \
--query "Snapshots[?StartTime<'${NINETY_DAYS_AGO}'].[SnapshotId,VolumeSize,StartTime]" \
--output table
echo -e "\n4. Load Balancers sin targets:"
for alb in $(aws elbv2 describe-load-balancers --query 'LoadBalancers[*].LoadBalancerArn' --output text); do
targets=$(aws elbv2 describe-target-groups --load-balancer-arn $alb --query 'TargetGroups[*].TargetGroupArn' --output text)
if [ -z "$targets" ]; then
echo "ALB sin targets: $alb"
fi
done
echo -e "\n=== Análisis terminado ==="
AWS Budgets
Configuración
┌─────────────────────────────────────────────────────────────┐
│ AWS BUDGETS │
├─────────────────────────────────────────────────────────────┤
│ │
│ TIPOS DE PRESUPUESTOS : │
│ │
│ • Cost Budget : Límite de gasto │
│ • Usage Budget : Límite de uso (horas, GB) │
│ • Reservation Budget : Cobertura RI/Savings Plans │
│ │
│ EJEMPLO DE CONFIGURACIÓN : │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Nombre del Presupuesto: Monthly-Production │ │
│ │ Monto: $5,000 │ │
│ │ Periodo: Mensual │ │
│ │ │ │
│ │ Alertas: │ │
│ │ • 50% ($2,500) → Email info │ │
│ │ • 80% ($4,000) → Email warning │ │
│ │ • 100% ($5,000) → Email + SMS │ │
│ │ • 110% forecasted → Email alerta │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
# Crear un presupuesto
aws budgets create-budget \
--account-id 123456789012 \
--budget '{
"BudgetName": "Monthly-Limit",
"BudgetLimit": {
"Amount": "5000",
"Unit": "USD"
},
"TimeUnit": "MONTHLY",
"BudgetType": "COST"
}' \
--notifications-with-subscribers '[{
"Notification": {
"NotificationType": "ACTUAL",
"ComparisonOperator": "GREATER_THAN",
"Threshold": 80
},
"Subscribers": [{
"SubscriptionType": "EMAIL",
"Address": "team@example.com"
}]
}]'
Resumen de Recomendaciones
| Dominio | Acción | Ahorro Potencial |
|---|---|---|
| Tagging | Implementar tags obligatorios | Visibilidad |
| Right-sizing | Reducir instancias subutilizadas | 20-40% |
| Reserved/SP | Comprometerse en carga estable | 30-60% |
| Spot | Usar para workloads flexibles | 60-90% |
| Limpieza | Eliminar recursos huérfanos | 10-20% |
| Budgets | Alertas proactivas | Control |
Próxima sección: Lab FinOps