利用 AWS Price List API 生成中国区的 EC2 价格表

阅读数:151 2019 年 9 月 29 日 16:31

利用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"

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

利用AWS Price List API生成中国区的EC2 价格表

完整的 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 团队高级顾问,长期从事企业客户入云解决方案的制定和项目的实施工作。

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/how-to-use-aws-price-list-api-ec2price/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布