Introducción profunda a MCP: El protocolo abierto que conecta IA...
Leer másCó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.

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
Cómo Optimizar Costes en AWS y Análisis del CUR
Cómo Optimizar Costes en AWS y Analizar el CUR Descubre...
Leer másCómo hacer un Seguimiento de KPIs de Optimización de Costes con Dashboards de Indicadores en AWS
Cómo hacer un Seguimiento de KPIs de Optimización de Costes...
Leer más