需求背景
 
       企业客户在上云的实践过程中,一般都要经历系统迁移入云和云上运维优化这两个重要的阶段,且云上的优化是需要定期不停的做下去的,以达到持续降低成本、优化资源的使用率,以最小的成本、最大的资源利用率来保证业务系统稳定的运行,并能够根据业务系统的实际使用量来分配资源(减低配置或者扩容)。
 
       我们将分以下五个部分,介绍如何使用AWS API自动化的进行机型选择:
 
        
        - 利用AWS Price List API生成中国区的EC2 价格表
- 在迁移项目中,如何自动选择最经济的EC2
- 如何进行EC2优化,进一步优化成本
- 如何为SAP应用选择合适的EC2
- 如何整合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
 
        
 
       安装方法很简单:
 
        
        - git clone https://github.com/shaneliuyx/awscnprice.git
- cd awscnprice
- 执行如下命令:
 
        $ python setup.py biuld
$ python setup.py install
 
         
       现在你就可以正常使用了。
 
        
 
       生成EC2价格表
 
       我编写了一个名为get_ec2_info.py的程序,只要给出输出文件的名字,就可以得到EC2配置和价格的信息。
 
       #使用中国版的awspricing Python Library
 
        
       #接下来设置环境变量:
 
       #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续购日期
 
       本篇作者