2012-08-02 14 views
6

A menudo ejecuto instancias puntuales en EC2 (para trabajos de tarea Hadoop, nodos temporales, etc.) Algunas de estas son instancias puntuales de larga ejecución.Calcular el costo acumulado/acumulado de instancia de punto EC2

Es bastante fácil calcular el costo de instancias EC2 a petición o reservadas, pero ¿cómo puedo calcular el costo incurrido por un nodo específico (o nodos) que se ejecutan como instancias puntuales?

Soy consciente de que el costo de una instancia puntual cambia cada hora según la tasa del mercado, entonces, ¿hay alguna forma de calcular el costo total acumulado para una instancia de punto activo? A través de una API o de otra manera?

Respuesta

4

He solución de Suman trabajar con boto3 re-escrito. ¡Asegúrate de usar utctime con el juego tz !:

def get_spot_instance_pricing(ec2, instance_type, start_time, end_time, zone): 
    result = ec2.describe_spot_price_history(InstanceTypes=[instance_type], StartTime=start_time, EndTime=end_time, AvailabilityZone=zone) 
    assert 'NextToken' not in result or result['NextToken'] == '' 

    total_cost = 0.0 

    total_seconds = (end_time - start_time).total_seconds() 
    total_hours = total_seconds/(60*60) 
    computed_seconds = 0 

    last_time = end_time 
    for price in result["SpotPriceHistory"]: 
     price["SpotPrice"] = float(price["SpotPrice"]) 

     available_seconds = (last_time - price["Timestamp"]).total_seconds() 
     remaining_seconds = total_seconds - computed_seconds 
     used_seconds = min(available_seconds, remaining_seconds) 

     total_cost += (price["SpotPrice"]/(60 * 60)) * used_seconds 
     computed_seconds += used_seconds 

     last_time = price["Timestamp"] 

    # Difference b/w first and last returned times 
    avg_hourly_cost = total_cost/total_hours 
    return avg_hourly_cost, total_cost, total_hours 
6

OK Encontré una manera de hacer esto en la biblioteca de Boto. Este código no es perfecto: Boto no parece devolver el rango de tiempo exacto, pero sí los precios spot históricos más o menos dentro de un rango. El siguiente código parece funcionar bastante bien. Si alguien puede mejorarlo, sería genial.

import boto, datetime, time 

# Enter your AWS credentials 
aws_key = "YOUR_AWS_KEY" 
aws_secret = "YOUR_AWS_SECRET" 

# Details of instance & time range you want to find spot prices for 
instanceType = 'm1.xlarge' 
startTime = '2012-07-01T21:14:45.000Z' 
endTime = '2012-07-30T23:14:45.000Z' 
aZ = 'us-east-1c' 

# Some other variables 
maxCost = 0.0 
minTime = float("inf") 
maxTime = 0.0 
totalPrice = 0.0 
oldTimee = 0.0 

# Connect to EC2 
conn = boto.connect_ec2(aws_key, aws_secret) 

# Get prices for instance, AZ and time range 
prices = conn.get_spot_price_history(instance_type=instanceType, 
    start_time=startTime, end_time=endTime, availability_zone=aZ) 

# Output the prices 
print "Historic prices" 
for price in prices: 
    timee = time.mktime(datetime.datetime.strptime(price.timestamp, 
    "%Y-%m-%dT%H:%M:%S.000Z").timetuple()) 
    print "\t" + price.timestamp + " => " + str(price.price) 
    # Get max and min time from results 
    if timee < minTime: 
    minTime = timee 
    if timee > maxTime: 
    maxTime = timee 
    # Get the max cost 
    if price.price > maxCost: 
    maxCost = price.price 
    # Calculate total price 
    if not (oldTimee == 0): 
    totalPrice += (price.price * abs(timee - oldTimee))/3600 
    oldTimee = timee 

# Difference b/w first and last returned times 
timeDiff = maxTime - minTime 

# Output aggregate, average and max results 
print "For: one %s in %s" % (instanceType, aZ) 
print "From: %s to %s" % (startTime, endTime) 
print "\tTotal cost = $" + str(totalPrice) 
print "\tMax hourly cost = $" + str(maxCost) 
print "\tAvg hourly cost = $" + str(totalPrice * 3600/ timeDiff) 
3

Puede suscribirse al feed de datos de instancias puntuales para obtener cargos por sus instancias en ejecución descargadas a un depósito S3. Instalar el conjunto de herramientas de EC2 y luego ejecutar:

ec2-create-spot-datafeed-subscription -b bucket-to-dump-in 

Nota: se puede tener la suscripción de alimentación único de datos para toda la cuenta.

En aproximadamente una hora se debe comenzar a ver los archivos delimitados con pestañas gzip aparecer en el cubo que se ven algo como esto:

#Version: 1.0 
#Fields: Timestamp UsageType Operation InstanceID MyBidID MyMaxPrice MarketPrice Charge Version 
2013-05-20 14:21:07 UTC SpotUsage:m1.xlarge RunInstances:S0012 i-1870f27d sir-b398b235 0.219 USD 0.052 USD 0.052 USD 1 
1

Recientemente he desarrollado una pequeña biblioteca de Python que calcula el coste de un solo EMR clúster, o para una lista de clusters (dado un período de días).

Tiene en cuenta las instancias puntuales y los nodos de tareas también (que pueden subir y bajar mientras el clúster aún se está ejecutando).

Para calcular el costo, utilizo el precio de oferta, que (en muchos casos) podría no ser el precio exacto que termina pagando por la instancia. Dependiendo de su política de ofertas, sin embargo, este precio puede ser lo suficientemente preciso.

Puede encontrar el código aquí: https://github.com/memosstilvi/emr-cost-calculator

Cuestiones relacionadas