Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can one get current spot price via boto?

I am trying to fetch current spot price via boto in python using get_spot_price_history() function.

conn = boto.connect_ec2(aws_key, aws_secret)
prices = conn.get_spot_price_history("m3.medium", '2017-04-20T21:14:45.000Z', '2017-04-20T21:20:45.000Z',"us-east-1")

It is giving an error

Traceback (most recent call last):
  File "run.py", line 22, in <module>
    prices = conn.get_spot_price_history("m3.medium", '2017-04-20T21:14:45.000Z', '2017-04-20T21:20:45.000Z',"us-east-1")
  File "/usr/lib/python2.6/site-packages/boto/ec2/connection.py", line 1421, in get_spot_price_history
    [('item', SpotPriceHistory)], verb='POST')
  File "/usr/lib/python2.6/site-packages/boto/connection.py", line 1182, in get_list
    raise self.ResponseError(response.status, response.reason, body)
boto.exception.EC2ResponseError: EC2ResponseError: 400 Bad Request
<?xml version="1.0" encoding="UTF-8"?>
<Response><Errors><Error><Code>InvalidRequest</Code><Message>The request received was invalid.</Message></Error></Errors><RequestID>da79e2ba-7475-4133-98f3-3c6aab8a07c6</RequestID></Response>

My aim is to get current price of an spot instance. Can anyone tell me what i am doing wrong or some other easy way/function to get spot's market value. I am new to amazon web services. Please help.

like image 625
Shubham Verma Avatar asked Apr 24 '17 10:04

Shubham Verma


3 Answers

It looks like returned results are in reverse order, so the most-recent prices are returned first.

Using boto3 (which is recommended these days):

import boto3

client=boto3.client('ec2',region_name='us-east-1')

prices=client.describe_spot_price_history(InstanceTypes=['m3.medium'],MaxResults=1,ProductDescriptions=['Linux/UNIX (Amazon VPC)'],AvailabilityZone='us-east-1a')

print prices['SpotPriceHistory'][0]

Returns:

{u'Timestamp': datetime.datetime(2017, 4, 24, 20, 2, 11, tzinfo=tzlocal()),
u'ProductDescription': 'Linux/UNIX (Amazon VPC)',
u'InstanceType': 'm3.medium',
u'SpotPrice': '0.700000',
u'AvailabilityZone': 'us-east-1a'}

Please note that this does not guarantee that this is the price you would pay if you launched a matching spot instance in us-east-1a. It's merely the latest reported price for that combination.

  • On-Demand list price: $0.067
  • Latest spot price returned: $0.007 (I presume the result was in cents)
  • Spot instance pricing page was showing: $0.011
like image 102
John Rotenstein Avatar answered Oct 16 '22 13:10

John Rotenstein


us-east-1 is a region name, get_spot_price_history accepts (optional) an availability zone. For region us-east-1, the zones are us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1e.

And pass the arguments as keyword arguments,

prices = conn.get_spot_price_history(instance_type="m3.medium",
                                     start_time="2017-04-20T21:14:45.000Z", 
                                     end_time="2017-04-20T21:20:45.000Z",
                                     availability_zone="us-east-1a")
like image 23
franklinsijo Avatar answered Oct 16 '22 11:10

franklinsijo


Get infos for all regions:

import boto3
import datetime

client = boto3.client('ec2', region_name='us-west-2')
regions = [x["RegionName"] for x in client.describe_regions()["Regions"]]

INSTANCE = "p2.xlarge"
print("Instance: %s" % INSTANCE)

results = []

for region in regions:
    client = boto3.client('ec2', region_name=region)
    prices = client.describe_spot_price_history(
        InstanceTypes=[INSTANCE],
        ProductDescriptions=['Linux/UNIX', 'Linux/UNIX (Amazon VPC)'],
        StartTime=(datetime.datetime.now() -
                   datetime.timedelta(hours=4)).isoformat(),
        MaxResults=1
    )
    for price in prices["SpotPriceHistory"]:
        results.append((price["AvailabilityZone"], price["SpotPrice"]))

for region, price in sorted(results, key=lambda x: x[1]):
    print("Region: %s price: %s" % (region, price))
like image 44
delijati Avatar answered Oct 16 '22 12:10

delijati