为什么EC2的列表与EMR列表不同?
EC2:https://aws.amazon.com/ec2/spot/pricing/
EMR:https://aws.amazon.com/emr/pricing/为什么EC2的所有实例类型都不适用于EMR?如何获得这个特殊名单?
答案 0 :(得分:0)
如果您的问题与亚马逊控制台无关 (然后它肯定会以off-topic)关闭:
作为编程解决方案,您看起来像这样:(使用python boto3 )
import boto3
client = boto3.client('emr')
for instance in client.list_instances():
print("Instance[%s] %s"%(instance.id, instance.name))
答案 1 :(得分:0)
这是我使用的,尽管我不是100%地确定它是准确的(因为我找不到支持我的某些选择(-BoxUsage等)的文档)。
值得仔细研究一下AWS的响应,以便找出定价客户端响应中不同字段的不同值。
使用以下命令获取响应列表:
default_profile = boto3.session.Session(profile_name='default')
# Only us-east-1 has the pricing API
# - https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/pricing.html
pricing_client = default_profile.client('pricing', region_name='us-east-1')
service_name = 'ElasticMapReduce'
product_filters = [
{'Type': 'TERM_MATCH', 'Field': 'location', 'Value': aws_region_name}
]
response = pricing_client.get_products(
ServiceCode=service_name,
Filters=product_filters,
MaxResults=100
)
response_list.append(response)
num_prices = 100
while 'NextToken' in response:
# re-query to get next page
获得响应列表后,就可以过滤出实际的实例信息:
emr_prices = {}
for response in response_list:
for price_info_str in response['PriceList']:
price_obj = json.loads(price_info_str)
attributes = price_obj['product']['attributes']
# Skip pricing info that doesn't specify a (EC2) instance type
if 'instanceType' not in attributes:
continue
inst_type = attributes['instanceType']
# AFAIK, Only usagetype attributes that contain the string '-BoxUsage' are the ones that contain the prices that we would use (empirical research)
# Other examples of values are <REGION-CODE>-M3BoxUsage, <REGION-CODE>-M5BoxUsage, <REGION-CODE>-M7BoxUsage (no clue what that means.. )
if '-BoxUsage' not in attributes['usagetype']:
continue
if 'OnDemand' not in price_obj['terms']:
continue
on_demand_info = price_obj['terms']['OnDemand']
price_dim = list(list(on_demand_info.values())[0]['priceDimensions'].values())[0]
emr_price = Decimal(price_dim['pricePerUnit']['USD'])
emr_prices[inst_type] = emr_price
实际上,从boto3文档中找出原因很简单。特别是get_products文档。