Amazon ec2 计算EC2 spot实例的运行/累计成本

Amazon ec2 计算EC2 spot实例的运行/累计成本,amazon-ec2,Amazon Ec2,我经常在EC2上运行spot实例(用于Hadoop任务作业、临时节点等),其中一些是长期运行的spot实例 计算按需或保留EC2实例的成本相当容易,但如何计算作为spot实例运行的特定节点(或多个节点)的成本 我知道现货实例的成本每小时都在变化,这取决于市场利率——那么有没有办法计算一个正在运行的现货实例的累计总成本呢?通过API或其他方式?好的,我在Boto库中找到了一种方法。这段代码并不完美——Boto似乎没有返回准确的时间范围,但它确实在一定范围内获得了历史现货价格。下面的代码似乎工作得很

我经常在EC2上运行spot实例(用于Hadoop任务作业、临时节点等),其中一些是长期运行的spot实例

计算按需或保留EC2实例的成本相当容易,但如何计算作为spot实例运行的特定节点(或多个节点)的成本


我知道现货实例的成本每小时都在变化,这取决于市场利率——那么有没有办法计算一个正在运行的现货实例的累计总成本呢?通过API或其他方式?

好的,我在Boto库中找到了一种方法。这段代码并不完美——Boto似乎没有返回准确的时间范围,但它确实在一定范围内获得了历史现货价格。下面的代码似乎工作得很好。如果有人能改进它,那就太好了

导入boto、datetime、time
#输入您的AWS凭据
aws\u key=“您的\u aws\u key”
aws\u secret=“您的密码”
#要查找现货价格的实例和时间范围的详细信息
instanceType='m1.xlarge'
开始时间='2012-07-01T21:14:45.000Z'
结束时间='2012-07-30T23:14:45.000Z'
aZ='us-east-1c'
#其他一些变量
最大成本=0.0
minTime=float(“inf”)
最大时间=0.0
总价=0.0
oldTimee=0.0
#连接到EC2
conn=boto.connect\U ec2(aws\U密钥,aws\U机密)
#获取价格,例如,AZ和时间范围
prices=conn.get\u spot\u price\u history(实例类型=实例类型,
开始时间=开始时间,结束时间=结束时间,可用性区域=aZ)
#输出价格
打印“历史价格”
价格中的价格:
timee=time.mktime(datetime.datetime.strtime(price.timestamp,
%Y-%m-%dT%H:%m:%S.000Z”).timetuple()
打印“\t”+price.timestamp+“=>”+str(price.price)
#从结果中获取最大和最小时间
如果timeemaxTime:
maxTime=timee
#获得最大成本
如果price.price>maxCost:
maxCost=price.price
#计算总价
如果不是(oldTimee==0):
总价+=(price.price*abs(timee-oldTimee))/3600
oldtime=timee
#第一次和最后一次返回时间的差异
timeDiff=maxTime-minTime
#输出聚合、平均和最大结果
打印“用于%s中的一个%s%”(instanceType,aZ)
打印“从:%s到%s”%(开始时间,结束时间)
打印“\t总成本=$”+str(总价)
打印“\t最大小时成本=$”+str(最大成本)
打印“\tAvg小时成本=$”+str(总价*3600/timeDiff)

您可以订阅spot实例数据馈送,以获取转储到S3存储桶的运行实例的费用。安装ec2工具集,然后运行:

ec2-create-spot-datafeed-subscription -b bucket-to-dump-in
注意:您的整个帐户只能有一个数据源订阅

大约一个小时后,您将开始看到gzip选项卡分隔的文件显示在bucket中,如下所示:

#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

我最近开发了一个小型python库,用于计算单个EMR集群或集群列表(给定一段时间)的成本

它还考虑了Spot实例和任务节点(在集群仍在运行时,它们可能会上下波动)

为了计算成本,我使用了出价,在很多情况下,这可能不是您最终为实例支付的确切价格。 但是,根据您的投标政策,此价格可能足够准确


您可以在这里找到代码:

我已经编写了Suman的解决方案来处理Bot3。确保将utctime与tz集合一起使用!:

def get_spot_instance_定价(ec2,instance_类型,开始时间,结束时间,区域):
结果=ec2.描述现货价格历史(InstanceTypes=[实例类型],StartTime=开始时间,EndTime=结束时间,AvailabilityZone=区域)
在结果或结果['NextToken']=''中断言'NextToken'
总成本=0.0
总秒数=(结束时间-开始时间)。总秒数()
总小时=总秒/(60*60)
计算秒数=0
上次时间=结束时间
对于结果中的价格[“SpotPriceHistory”]:
价格[“SpotPrice”]=浮动(价格[“SpotPrice”])
可用秒数=(上次时间-价格[“时间戳])。总秒数()
剩余秒数=总秒数-计算秒数
已用秒数=分钟(可用秒数,剩余秒数)
总成本+=(价格[“SpotPrice”]/(60*60))*已用秒数
计算的秒数+=使用的秒数
上次时间=价格[“时间戳”]
#第一次和最后一次返回时间的差异
平均每小时成本=总成本/总小时
返回平均每小时成本、总成本、总小时