【问题标题】:How can one get current spot price via boto?如何通过 boto 获取当前现货价格?
【发布时间】:2017-09-21 00:32:11
【问题描述】:

我正在尝试使用 get_spot_price_history() 函数在 python 中通过 boto 获取当前现货价格。

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>

我的目标是获取现货实例的当前价格。谁能告诉我我做错了什么或其他一些简单的方法/功能来获得现货的市场价值。 我是亚马逊网络服务的新手。请帮忙。

【问题讨论】:

    标签: python amazon-ec2 boto


    【解决方案1】:

    看起来返回的结果是倒序的,所以最先返回最近的价格。

    使用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 中启动匹配的 Spot 实例,这并不能保证这是您愿意支付的价格。这只是该组合的最新报告价格。

    • 按需定价:0.067 美元
    • 返回的最新现货价格:0.007 美元(我假设结果以美分为单位)
    • Spot instance pricing page 显示:$0.011

    【讨论】:

    • 非常感谢您的帮助。这正是我所需要的。现在我可以进一步处理我的代码了。
    • 你能告诉我现货车队是如何得到它的市场价格(投标价格)吗?我将从上述代码中获得的现货价格是否会决定我的集群将继续运行?
    • 以上代码只是为您提供了定价历史。价格根据供需情况定期调整。实际收取的价格在Spot Instance Data Feed 中给出。没有办法知道“当前”价格,因为它可以随时重新计算——就像股票市场只能向您显示最近的交易价格,但在交易实际发生之前不能保证交易价格。另请注意,现货车队定价是单独计算的。
    • 每个正在运行的 Spot 实例的 Spot 实例定价不会在每个实例小时内发生变化。它在每个实例小时开始时以市场价格冻结,这可能与挂钟小时不一致。 Source.
    • 另请注意,Linux/UNIX 表示 EC2 Classic,而不是 VPC,如果您从该区域中启用 EC2 Classic 的账户查询,则表示较新账户中的 VPC。不同的定价。这或许可以解释价格不匹配。 API 应与控制台匹配。 Linux/UNIX (Amazon VPC) 是您想要的魔术字符串,IIRC 会返回所有帐户的正确定价。
    【解决方案2】:

    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")
    

    【讨论】:

    • 当我但是 maxresult = 1000 时,我只得到类型“us-east-f1”的 168 个结果,你知道为什么吗?
    【解决方案3】:

    获取所有地区的信息:

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2021-04-08
      • 2021-05-17
      • 1970-01-01
      • 2020-01-18
      • 2021-08-02
      • 1970-01-01
      相关资源
      最近更新 更多