需求背景
企业客户在上云的实践过程中,一般都要经历系统迁移入云和云上运维优化这两个重要的阶段,且云上的优化是需要定期不停的做下去的,以达到持续降低成本、优化资源的使用率,以最小的成本、最大的资源利用率来保证业务系统稳定的运行,并能够根据业务系统的实际使用量来分配资源(减低配置或者扩容)。
我们将分以下五个部分,介绍如何使用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.rproxy.goskope.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.rproxy.goskope.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续购日期
本篇作者