def get_instance_data(raw_data): print('computing instance data') ec2_offer = awspricing.offer('AmazonEC2') print('retrieved amazon ec2 offer data') simple_instance_data = defaultdict(list) for instance in raw_data: baseline = instance['vCPU'] if instance['base_performance'] is not None: baseline = instance['base_performance'] if baseline == "N/A": continue instance_info = { 'instanceType': instance['instance_type'], 'gpu': instance['GPU'], 'memory': instance['memory'], 'cpu': instance['vCPU'], 'burstable': instance["burst_minutes"] is not None, 'baseline': baseline, 'generation': instance['generation'], } if instance["generation"] != 'current': continue for region in regions: try: price = ec2_offer.ondemand_hourly( instance_type=instance['instance_type'], operating_system='Linux', region=region, ) instance_info['price'] = float(price) print(instance_info) simple_instance_data[region].append(instance_info) except ValueError: continue return simple_instance_data
def update_pricing(): # Purge existing database database.purge() # Get an EC2 price list from amazon ec2_offer = awspricing.offer('AmazonEC2') # Retrieve latest pricing for vm and insert in database for (aws_vmgroup, aws_vmtypelist) in aws_vmtypes: for (aws_vmtype, aws_vmdesc) in aws_vmtypelist: try: # DB format change (bug in awspricing) aws_pricing = ec2_offer.ondemand_hourly(aws_vmgroup+aws_vmtype,operating_system=aws_ostype,region=aws_region) # Ondemand makes a distinction between Used, ReservationBox, ... sku = ec2_offer.search_skus(instance_type=aws_vmgroup + aws_vmtype, operating_system=aws_ostype, tenancy='Shared', location='EU (Frankfurt)', licenseModel='No License required', preInstalledSw='NA', capacitystatus='Used').pop() print ec2_offer._offer_data[sku]['terms']['OnDemand'] aws_pricing = next( six.itervalues( next( six.itervalues( ec2_offer._offer_data[sku]['terms']['OnDemand'] ))['priceDimensions']))['pricePerUnit']['USD'] print aws_pricing except: aws_pricing = 'n/a' pass database.insert({ 'type': aws_vmgroup + aws_vmtype, 'pricing': aws_pricing }) # Store timestamp database.insert( {'timestamp': str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M'))})
def CheapestEc2Region(type='t2.micro'): #os.environ['AWSPRICING_USE_CACHE'] = '1' #os.environ['AWSPRICING_CACHE_MINUTES'] = '10080' #10080 = 1 week import awspricing ec2_offer = awspricing.offer('AmazonEC2') #Cheapest region min_price = math.inf min_region = [] #All regions all_regions = [] # Search price for every region ec2 = boto3.client('ec2') response = ec2.describe_regions() for reg in response['Regions']: name = reg['RegionName'] try: p = ec2_offer.ondemand_hourly(type, operating_system='Linux', region=name) all_regions.append({'region': name, 'price': p}) if p < min_price: min_price = p min_region = [name] elif p == min_price: min_region.append(name) except: pass return { 'region': min_region, 'price': min_price, 'all_regions': all_regions }
import awspricing ec2_offer = awspricing.offer('AmazonEC2') ec2_offer.search_skus( instance_type='c4.large', location='US East (N. Virginia)', operating_system='Linux', ) # {'4C7N4APU9GEUZ6H6', 'MBQPYDJSY3BY84BH', 'MDKVAJXMJGZFDJUE'} ec2_offer.reserved_hourly('c4.xlarge', operating_system='Linux', lease_contract_length='3yr', offering_class='convertible', purchase_option='Partial Upfront', region='us-east-1')
def lookup_monthly_price(region_name: str, instance_type: str, operating_system: str) -> float: ec2_offer = awspricing.offer('AmazonEC2') hourly = ec2_offer.ondemand_hourly(instance_type, region=region_name, operating_system=operating_system) return hourly * HOURS_IN_A_MONTH
def prices(svc='AmazonEC2'): import awspricing awsproce = awspricing.offer(svc) return awsprice
import awspricing from awspricing import cache awspricing.cache.AWSPRICING_USE_CACHE=1 ec2_offer = awspricing.offer('AmazonEC2') ec2_offer.search_skus( instance_type='c4.large', location='US East (N. Virginia)', operating_system='Linux', ) # {'4C7N4APU9GEUZ6H6', 'MBQPYDJSY3BY84BH', 'MDKVAJXMJGZFDJUE'} fltC4LargePricing=ec2_offer.ondemand_hourly( 'c4.large', operating_system='Linux', # lease_contract_length='3yr', # offering_class='standard', # purchase_option='Partial Upfront', region='us-east-1' ) # 0.10845205479452055 print "Hourly c4.large pricing in us-east-1: $" + str(fltC4LargePricing)