Python 3.x 如何使用boto检查EMR现货实例价格历史记录
我想使用现货定价以编程方式创建一个EMR集群,以实现一些成本节约。为此,我正在尝试使用boto3从AWS检索EMR现货实例定价,但我从boto3了解到的唯一可用API是使用ec2客户端的Python 3.x 如何使用boto检查EMR现货实例价格历史记录,python-3.x,amazon-web-services,boto3,amazon-emr,Python 3.x,Amazon Web Services,Boto3,Amazon Emr,我想使用现货定价以编程方式创建一个EMR集群,以实现一些成本节约。为此,我正在尝试使用boto3从AWS检索EMR现货实例定价,但我从boto3了解到的唯一可用API是使用ec2客户端的decribe\u spot\u price\u history调用- EC2的价格并不表示此处所示的EMR的价格-。这些值几乎是EMR的两倍 有没有一种方法可以让我看到类似于EC2的EMR现货价格历史?我已经检查了AWS online关于这一点的文档和其他几页,但没有发现任何东西 这里有一个代码片段,我用它来检
decribe\u spot\u price\u history
调用-
EC2的价格并不表示此处所示的EMR的价格-。这些值几乎是EMR的两倍
有没有一种方法可以让我看到类似于EC2的EMR现货价格历史?我已经检查了AWS online关于这一点的文档和其他几页,但没有发现任何东西
这里有一个代码片段,我用它来检查大致的定价,我可以用它来对EMR实例进行投标
max\u bid\u price=0.140
最低投标价格=最高投标价格
az_选项=“”
响应=ec2.描述现货价格历史(
过滤器=[{
“名称”:“可用区域”,
‘值’:[‘us-east-1a’、‘us-east-1c’、‘us-east-1d’]
},
{
“名称”:“产品说明”,
“值”:[“Linux/UNIX(亚马逊专有网络)”]
}],
InstanceTypes=['r5.2xlarge'],
EndTime=datetime.now(),
StartTime=datetime.now()
)
#待办事项:如果从现有的3个AZ中选择是一个问题,请在其他AZ中添加更多子网
#‘美国东部-1b’、‘美国东部-1e’、‘美国东部-1f’
对于响应中的现货价格历史记录['SpotPriceHistory']:
打印(现货价格历史记录)
如果浮动(现货价格历史['SpotPrice'])没有所谓的EMR现货定价,正如评论中已经提到的那样。现货定价适用于EC2实例。您可以查看AWS spot advisor页面,找出中断率较低的实例类别,并根据这些类别进行选择
自2017年以来,AWS改变了现货定价的算法,“根据长期供需趋势,价格调整更加渐进”,因此您可能不需要查看历史现货价格。更多关于这方面的细节可以找到
现在,你很可能会很好地使用最后一个价格(+delta)的例子。这可以使用以下代码段实现:
def get_bid_price(instancetype, aws_region):
instance_types = [instancetype]
start = datetime.now() - timedelta(days=1)
ec2_client = boto3.client('ec2', aws_region)
price_dict = ec2_client.describe_spot_price_history(StartTime=start,
InstanceTypes=instance_types,
ProductDescriptions=['Linux/UNIX (Amazon VPC)']
)
if len(price_dict.get('SpotPriceHistory')) > 0:
PriceHistory = namedtuple('PriceHistory', 'price timestamp')
price_list = [PriceHistory(round(float(item.get('SpotPrice')), 3), item.get('Timestamp'))
for item in price_dict.get('SpotPriceHistory')]
price_list.sort(key=lambda tup: tup.timestamp, reverse=True)
# Maybe add 10 cents to the last spot price
bid_price = round(float(price_list[0][0] + .01), 3)
return bid_price
else:
raise ValueError('Invalid instance type: {} provided. '
'Please provide correct instance type.'.format(instancetype))
当您使用EMR时,它将按EMR价格+每个EC2价格收费。EMR没有现货价格,您可以获得每个节点的现货价格,然后添加EMR随需价格。这是总价。