亚马逊AWS官方博客

如何自动化的选择和优化EC2系列(一)利用AWS Price List API生成中国区的EC2 价格表

需求背景

企业客户在上云的实践过程中,一般都要经历系统迁移入云和云上运维优化这两个重要的阶段,且云上的优化是需要定期不停的做下去的,以达到持续降低成本、优化资源的使用率,以最小的成本、最大的资源利用率来保证业务系统稳定的运行,并能够根据业务系统的实际使用量来分配资源(减低配置或者扩容)。

我们将分以下五个部分,介绍如何使用AWS API自动化的进行机型选择:

  1. 利用AWS Price List API生成中国区的EC2 价格表
  2. 在迁移项目中,如何自动选择最经济的EC2
  3. 如何进行EC2优化,进一步优化成本
  4. 如何为SAP应用选择合适的EC2
  5. 如何整合RI续购日期

本文先介绍第一部分:利用AWS Price List API生成中国区的EC2 价格表

 

方案概述

为了选择合适的EC2机型,第一步要做的就是了解不同机型的配置以及价格,通常我们会去访问AWS中国区的网页(https://www.amazonaws.cn/en/ec2/pricing/ ),来查找相关的信息。如果你访问过这个网页,你就会发现,找到你需要的信息是一件多么繁琐的事情。如果你要了解EC2不同机型的配置,你需要访问On-Demand instances 的价格,因为在Reserved Instance网页中没有机型的配置信息。如果你要比较满足一定配置要求(vCPU,Memory)的不同服务器的一年All Upfront Reserve Instance价格,你就需要来回查看不同网页中的信息,非常费事。这时你也许会想,如果这些信息都保存在一张EXCEL表格中,那用起来该多方便啊!

下面就介绍一种利用AWS Price List API生成你需要的价格表的方法。这里我们首先会用到Lyft公司开发的awspricing Python Library(https://github.com/lyft/awspricing ),但是这个Python Library只能查询海外的EC2价格和RDS价格,为了使其能够查询国内的价格,我做了一些改动,使其成为中国版的awspricing Python Library ,下载地址是:https://github.com/shaneliuyx/awscnprice

 

安装方法很简单:

  1. git clone https://github.com/shaneliuyx/awscnprice.git
  2. cd awscnprice
  3. 执行如下命令:
$ python setup.py biuld

$ python setup.py install

现在你就可以正常使用了。

 

生成EC2价格表

我编写了一个名为get_ec2_info.py的程序,只要给出输出文件的名字,就可以得到EC2配置和价格的信息。

#使用中国版的awspricing Python Library

import awscnpricing

#接下来设置环境变量:

#AWSPRICING_USE_CACHE设置为1,使用Cache文件

os.environ['AWSPRICING_USE_CACHE'] = "1"

#Cache文件的位置:

os.environ['AWSPRICING_CACHE_PATH'] = "/tmp/awscnpricing"

#Cache文件的有效期:24小时

os.environ['AWSPRICING_CACHE_MINUTES'] = "1440" 如果你一天多次查询价格,使用Cache文件会大大加快速度,价格文件大约有18MB,如果每次都从网上下载,速度还是比较慢的。

#设置需要得到的价格表信息:

offering_class = 'standard'

 

此处设置为standard,得到的是标准Reserved Instance的价格,如果设置成convertible,则可以得到可变RI的价格。

#设置输出文件名:

output = 'cn_ec2_standard_price.xlsx'

 

下面一段检查缓存文件是否存在,如果不存在,就从网上下载:

ec2_offer_code = 'AmazonEC2'

ec2_offer = awscnpricing.offer(ec2_offer_code)

ec2_file_path = os.getenv('AWSPRICING_CACHE_PATH')

ec2_file_name = 'offer_{}_current'.format(ec2_offer_code)

ec2_cache_file = os.path.join(ec2_file_path, ec2_file_name)

if os.path.exists(ec2_cache_file):

    with open(ec2_cache_file, 'r') as load_f:

        ec2offer = json.load(load_f)

else:

    offers = requests.get(

        'https://pricing.cn-north-1.amazonaws.com.cn/offers/v1.0/cn/index.json'

    )

    ec2_offer_path = offers.json()['offers']['AmazonEC2']['currentVersionUrl']

    ec2offer = requests.get(

        'https://pricing.cn-north-1.amazonaws.com.cn%s' % ec2_offer_path

    ).json()

 

这个程序主要生成1年和3年RI的价格(包含All Upfront、Partial Upfront, No Upfront)以及On-Demand EC2的价格,包含China (Beijing)和China (Ningxia)两个Region。

PerchaseOption = ['All Upfront', 'Partial Upfront', 'No Upfront']

LeaseContractLength = ['1yr', '3yr']

 

for sku, data in ec2offer['products'].items():

    if data['productFamily'] != 'Compute Instance':

        # skip anything that's not an EC2 Instance

        continue

    ec2_type = data['attributes']['instanceType']


    ec2_os = data['attributes']['operatingSystem']


    site = data['attributes']['location']

    ec2_region = ""

    if site == "China (Beijing)":

        ec2_region = "cn-north-1"

    if site == "China (Ningxia)":

        ec2_region = "cn-northwest-1"

 

使用如下API得到RI的价格(a_price)和On-Demand Instance(o_price)的价格。如果某类型的价格不存在,则价格显示为0

 

for yr in LeaseContractLength:

for p_option in PerchaseOption:

try:

a_price = ec2_offer.reserved_upfront(

ec2_type,

operating_system=ec2_os,

lease_contract_length=yr,

tenancy=data['attributes']['tenancy'],

license_model=data['attributes']['licenseModel'],

preinstalled_software=data['attributes']['preInstalledSw'],

offering_class=offering_class,

purchase_option=p_option,

region=ec2_region,

capacity_status=data['attributes']['capacitystatus']

)

except:

a_price = "0"

try:

o_price = ec2_offer.ondemand_hourly(

ec2_type,

operating_system=ec2_os,

tenancy=data['attributes']['tenancy'],

preinstalled_software=data['attributes']['preInstalledSw'],

license_model=data['attributes']['licenseModel'],

region=ec2_region,

capacity_status=data['attributes']['capacitystatus']

)

except:

o_price = "0"

 

最后生成的表格是这样的:

完整的Python程序可以在此处下载:

https://github.com/shaneliuyx/awscnprice/blob/master/examples/get_ec2_info.py

如果想详细了解AWS Price List API,请参考如下网址的内容:

https://aws.amazon.com/blogs/aws/new-aws-price-list-api/
————

如何自动化的选择和优化EC2系列(一)利用AWS Price List API生成中国区的EC2 价格表(本博文)

如何自动化的选择和优化EC2系列(二)在迁移项目中,如何自动选择最经济的EC2

如何自动化的选择和优化EC2系列(三)如何进行EC2优化,进一步优化成本

如何自动化的选择和优化EC2系列(四)如何为SAP应用选择合适的EC2

如何自动化的选择和优化EC2系列(五)如何整合RI续购日期

本篇作者

刘育新

AWS ProServe 团队高级顾问,长期从事企业客户入云解决方案的制定和项目的实施工作。