Как можно получить текущую спотовую цену через бото?
Я пытаюсь получить текущую спотовую цену через Boto в Python, используя get_spot_price_history()
функция.
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")
Это дает ошибку
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>
Моя цель - узнать текущую цену спотового экземпляра. Может кто-нибудь сказать мне, что я делаю неправильно или какой-нибудь другой простой способ / функцию, чтобы получить рыночную стоимость спота. Я новичок в веб-сервисах Amazon. Пожалуйста помоги.
3 ответа
Похоже, что возвращаемые результаты в обратном порядке, поэтому самые последние цены возвращаются первыми.
Используя boto3 (что рекомендуется в наши дни):
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]
Возвращает:
{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'}
Обратите внимание, что это не гарантирует, что это цена, которую вы заплатили бы, если бы запустили соответствующий экземпляр спота в us-east-1a. Это просто последняя заявленная цена для этой комбинации.
- Прайс-лист по запросу: $0,067
- Последняя возвращенная спотовая цена: $0,007 (я полагаю, результат был в центах)
- Показывалась страница с ценами для спотовых экземпляров: $0,011
us-east-1
это название региона, get_spot_price_history
принимает (необязательно) зону доступности. Для региона us-east-1
Зоны us-east-1a, us-east-1b, us-east-1c, us-east-1d, us-east-1e
,
И передать аргументы в качестве аргументов ключевых слов,
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")
Получите информацию для всех регионов:
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))