Saltar al contenido

SpainClouds |

Cómo Optimizar Costes en AWS y Analizar el CUR

Descubre cómo optimizar los costes en AWS mediante el análisis del informe CUR. Aprende a identificar recursos infrautilizados, reducir gastos y aplicar recomendaciones prácticas con Python.

Para gestionar eficazmente los costes en la nube, AWS recomienda comprender en detalle el uso y el gasto mediante herramientas como AWS Cost Explorer y los Cost and Usage Reports (CUR). En particular, el informe CUR proporciona un nivel de detalle granular (línea por línea) que permite identificar patrones de consumo y oportunidades de ahorro.

Cada informe CUR contiene múltiples columnas con prefijos como identity/, bill/ y lineItem/, además de campos específicos (por ejemplo, savingsPlan/) cuando se han utilizado recursos concretos durante el mes. Las buenas prácticas de AWS incluyen revisar periódicamente el CUR y complementarlo con herramientas nativas como CloudWatch, Cost Explorer, Trusted Advisor y Compute Optimizer para detectar recursos infrautilizados o inactivos y optimizar los costes.

Por ejemplo, AWS Trusted Advisor identifica recursos “idle” o poco utilizados que podrían eliminarse o ajustarse. AWS Compute Optimizer también ofrece recomendaciones para eliminar recursos inactivos como volúmenes EBS sin uso, instancias EC2, réplicas RDS o tareas ECS.

Además, AWS promueve el uso de instancias reservadas y Savings Plans para reducir la dependencia de instancias On-Demand, lo que puede suponer un ahorro de hasta un 72 %. El CUR permite comparar el uso On-Demand con el uso cubierto por RIs o Savings Plans. Los ítems de tipo Usage indican uso On-Demand, mientras que SavingsPlanNegation y DiscountedUsage reflejan beneficios aplicados por dichos planes.

Patrones Económicos a Identificar en el CUR

1. Recursos Infrautilizados o Inactivos

Como instancias EC2 con poca carga o volúmenes EBS sin actividad de entrada/salida. Aunque el CUR no incluye métricas de CPU o I/O, se pueden identificar recursos con facturación continua sin evidencia clara de uso.

2. Uso Excesivo de On-Demand

Comparar los costes de ítems Usage (On-Demand) con los de DiscountedUsage y SavingsPlanNegation. Si el porcentaje On-Demand es elevado, conviene considerar la compra de RIs o el uso de instancias Spot.

3. Volúmenes de Almacenamiento con Bajo Uso

Especialmente volúmenes EBS sin uso activo o snapshots antiguos. El CUR incluye cargos de tipo EBS:VolumeUsage y permite detectar volúmenes con costes relevantes que podrían estar infrautilizados.

4. Transferencias de Datos Costosas

El CUR detalla los cargos por transferencia de datos, que pueden provenir de servicios como NAT Gateway o PrivateLink. Analizando campos como line_item_usage_type, se pueden clasificar los tipos de tráfico y rediseñar la arquitectura para reducir costes.

5. Créditos y Descuentos No Aplicados

Los campos reservation/UnusedQuantity y UnusedRecurringFee en el CUR indican reservas no aprovechadas. Asimismo, es útil buscar ítems de tipo Credit o SavingsPlanNegation para identificar descuentos aplicables aún no utilizados.

Recibe nuestra Newsletter de Cloud semanal

Análisis del CUR con Python

El siguiente script en Python carga un informe CUR en formato Parquet y realiza un análisis básico para detectar los patrones anteriores. Utiliza la biblioteca pandas para filtrar y agrupar los datos:

import pandas as pd

# Cargar el informe CUR en formato Parquet
df = pd.read_parquet('cost_usage_report.parquet')

# 1. Uso On-Demand vs Reservado/Savings Plan
on_demand = df[df['lineItem/LineItemType'] == 'Usage']
cost_on_demand = on_demand['lineItem/UnblendedCost'].sum()

ri_covered = df[df['lineItem/LineItemType'] == 'DiscountedUsage']
cost_ri_covered = ri_covered['lineItem/UnblendedCost'].sum()

sp_offset = df[df['lineItem/LineItemType'] == 'SavingsPlanNegation']
cost_sp_offset = sp_offset['lineItem/UnblendedCost'].sum()

print(f"Coste total On-Demand: {cost_on_demand:.2f} USD")
print(f"Coste cubierto por RIs: {cost_ri_covered:.2f} USD")
print(f"Coste cubierto por Savings Plans: {cost_sp_offset:.2f} USD")

# 2. Instancias Spot
spot = df[df['lineItem/UsageType'].str.contains('Spot', na=False)]
cost_spot = spot['lineItem/UnblendedCost'].sum()
print(f"Coste total en Instancias Spot: {cost_spot:.2f} USD")

# 3. Volúmenes EBS con alto coste
ebs = df[df['lineItem/UsageType'].str.contains('EBS', na=False)]
if not ebs.empty:
ebs_cost = ebs.groupby('lineItem/ResourceId')['lineItem/UnblendedCost'].sum()
top_ebs = ebs_cost.sort_values(ascending=False).head(5)
print("\nTop 5 volúmenes EBS por coste:")
for vol_id, cost in top_ebs.items():
print(f" Volumen {vol_id}: {cost:.2f} USD")

# 4. Transferencias de datos
dt = df[
df['lineItem/UsageType'].str.contains('DataTransfer|NatGateway', na=False) |
df['product/ProductName'].str.contains('Data Transfer', na=False)
]
if not dt.empty:
dt_cost = dt.groupby('lineItem/UsageType')['lineItem/UnblendedCost'].sum().sort_values(ascending=False)
print("\nCostes por tipo de transferencia de datos:")
for usage_type, cost in dt_cost.items():
print(f" {usage_type}: {cost:.2f} USD")

# 5. Reservas no utilizadas
if 'reservation/UnusedQuantity' in df.columns:
unused = df[df['reservation/UnusedQuantity'] > 0]
if not unused.empty:
print("\nInstancias reservadas sin uso:")
for arn, qty in unused.groupby('reservation/ReservationARN')['reservation/UnusedQuantity']:
fee = unused[unused['reservation/ReservationARN'] == arn]['reservation/UnusedRecurringFee'].iloc[0]
print(f" ARN={arn}, Horas no usadas={qty.iloc[0]}, Coste no aprovechado={fee:.2f} USD")

Este script es una base adaptable a diferentes entornos empresariales. En un entorno real, conviene combinar el análisis CUR con métricas de CloudWatch u otras fuentes para mejorar la detección de recursos infrautilizados.

Aunque el CUR no proporciona métricas de rendimiento, sí detalla los costes, lo que lo convierte en una herramienta esencial para la optimización financiera en AWS.

Damian Munafo

Gerente Financiero en la Nube con más de 25 años de experiencia en arquitectura, innovación y orientación al cliente.
Apasionado de la nube y educador, comprometido con el desarrollo de plataformas y portales para divulgación y formación.
Tomo decisiones basadas en datos y mejoro la experiencia del cliente en cada proyecto en el que participo.
Profesional crítico y creativo. Profesional Certificado en FinOps y miembro de la comunidad FinOps Weekly.
Inventor por naturaleza, con 23 patentes aprobadas.

Fundador de SmartClouds, SpainClouds, Mastering Clouds y WaterRing. Cofundador de SmartCar Services, EuropeClouds y Mastering FinOps.

Tutoriales más recientes

Descubre nuestros últimos tutoriales en materia Cloud