背景

目前阿里云的ECS实例规格已经达到大约300种,有17个region,分成Io优化和非Io优化,操作系统分为windows和非windows类型,网络类型分为vpc和classic,再加上价格单位 按小时、按周、按月、1年、2年、3年、4年、5年有不同力度的打折,如果笼统的计算,不同的组合方式达到了300 17 2 2 2 * 8=32万种,除去阿里云不支持的组合大概也有4万种有效组合方式,除此之外还有磁盘 带宽的价格。面对如此庞大的服务器组合方式,到底哪种组合方式既满足业务需求,又花最少的钱?用户可以到价格界面进行搜索,也可以下载价格JSON自行实现搜索脚本。

价格JSON结构解读

实例、磁盘、带宽价格

{"currency": "CNY", //货币类型"description": "", //价格组合key介绍,实例:RegionId::InstanceType::NetworkType::OSType::IoOptimized,磁盘:RegionId::DiskCategory::DiskType,带宽:RegionId"disclaimer": "This pricing list is for informational purposes only.The actual price completely depends on ecs-buy.aliyun.com", //声明"publicationDate": "2018-08-06T07:00:04Z", //价格JSON生成时间"site": "CN", //站点"type": "Instance", //资源类型"version": "2.0.5", //版本"pricingInfo": {"ap-northeast-1::ecs.e4.2xlarge::vpc::linux::optimized": {"hours": [ //价格单位,所有单位:hours weeks months years traffic{"period": "1", //数量"price": "4.414" //价格"unit": "GB", //实例:无此项,磁盘:磁盘存储大小单位,带宽:价格单位 1.hours 按量计费 2.months 包年包月计费,带宽大小上限单位unit=Mbps 3.traffic 按流量计费,流量单位unit=GB"value": "1", //实例:无此项,磁盘和带宽:以unit为单位的个数。}]}}
}

各站点下载地址介绍

价格调整或有新规格上限,价格JSON版本会相继更新。
1.国内站,控制台界面

实例:https://g.alicdn.com/aliyun/ecs-price-info/2.0.5/price/download/instancePrice.json
磁盘:https://g.alicdn.com/aliyun/ecs-price-info/2.0.5/price/download/diskPrice.json
带宽:https://g.alicdn.com/aliyun/ecs-price-info/2.0.5/price/download/bandWidthPrice.json

2.国际站,控制台界面

实例:https://g.alicdn.com/aliyun/ecs-price-info-intl/2.0.3/price/download/instancePrice.json
磁盘:https://g.alicdn.com/aliyun/ecs-price-info-intl/2.0.3/price/download/diskPrice.json
带宽:https://g.alicdn.com/aliyun/ecs-price-info-intl/2.0.3/price/download/bandWidthPrice.json

3.日本站,控制台界面

实例:https://g.alicdn.com/aliyun/ecs-price-info-jp/2.0.1/price/download/instancePrice.json
磁盘:https://g.alicdn.com/aliyun/ecs-price-info-jp/2.0.1/price/download/diskPrice.json
带宽:https://g.alicdn.com/aliyun/ecs-price-info-jp/2.0.1/price/download/bandWidthPrice.json

搜索最低价格脚本示例

import urllib2
import json
from decimal import Decimal# load price data
def load_url_price(url):response = urllib2.urlopen(url)priceStr = response.read()priceJson = json.loads(priceStr)return priceJson# filtering according to conditions
def filter_by_condition(pricingInfo, regionId, instanceType, networkType, osType, ioType):filterPricingInfo = {}for key in pricingInfo:if (regionId != None):if (regionId not in key):continueif (instanceType != None):if (instanceType not in key):continueif (networkType != None):if (networkType not in key):continueif (osType != None):if (osType not in key):continueif (ioType != None):if (ioType not in key):continuefilterPricingInfo[key] = pricingInfo[key]return filterPricingInfo# converted into monthly price
def get_month_price(priceItem, priceUnit):price = Decimal(priceItem["price"])period = Decimal(priceItem["period"])if priceUnit == "hours":return price * 24 * 30 / periodif priceUnit == "weeks":return price / 7 * 30 / periodif priceUnit == "months":return price / periodif priceUnit == "years":return price / period / 12# small item calculation
def get_min_price_item(result, priceItemList, period, priceUnit, pricingKey):for priceItem in priceItemList:if period == None or str(period) == str(priceItem["period"]):monthPriceResult, monthPrice = 0, 0if result != None:monthPriceResult = get_month_price(result, result["priceUnit"])monthPrice = get_month_price(priceItem, priceUnit)if (monthPrice <= monthPriceResult or result == None):result = priceItemresult["priceUnit"] = priceUnitresult["pricingKey"] = pricingKeyreturn result# param validate
def param_validate(pricingInfo, regionId, instanceType, networkType, osType, ioType, priceUnit, period):filterPricingInfo = filter_by_condition(pricingInfo, regionId, instanceType, networkType, osType, ioType)checkMessageHeader = "Failed entry parameter check, "if filterPricingInfo:priceItem = filterPricingInfo.values()[0]if priceUnit != None:if not priceItem.has_key(priceUnit):raise RuntimeError(checkMessageHeader + "the priceUnit:{0} your input is not support.".format(priceUnit))if period != None:periodExisted = Falsefor tmpPriceUnit in priceItem:for tmpPeriodItem in priceItem[tmpPriceUnit]:checkPriceUnit = True if (priceUnit == None) else (tmpPriceUnit == priceUnit)if str(tmpPeriodItem["period"]) == str(period) and checkPriceUnit:periodExisted = Truebreakif not periodExisted:raise RuntimeError(checkMessageHeader + "the priceUnit:{0} period:{1} your input is not support.".format(priceUnit,period))else:raise RuntimeError(checkMessageHeader + "please check your regionId,instanceType,networkType,osType,ioType")return filterPricingInfo# query minimum price
def query_min_price(url, regionId, instanceType, networkType, osType, ioType, priceUnit, period):result = NonepriceJson = load_url_price(url)pricingInfo = priceJson["pricingInfo"]filterPricingInfo = param_validate(pricingInfo, regionId, instanceType, networkType, osType, ioType, priceUnit,period)for key in filterPricingInfo:if priceUnit != None:if filterPricingInfo[key].has_key(priceUnit):result = get_min_price_item(result, filterPricingInfo[key][priceUnit], period, priceUnit, key)else:for priceUnitKey in filterPricingInfo[key]:result = get_min_price_item(result, filterPricingInfo[key][priceUnitKey], period, priceUnitKey, key)return resultif __name__ == '__main__':url = "https://g.alicdn.com/aliyun/ecs-price-info/2.0.6/price/download/instancePrice.json"regionId = NoneinstanceType = "ecs.g5.2xlarge"# vpc classicnetworkType = None# linux windowsosType = None# optimized noneioType = None# hours weeks months yearspriceUnit = None# 1-5period = Nonetry:print json.dumps(query_min_price(url, regionId, instanceType, networkType, osType, ioType, priceUnit, period))except RuntimeError, e:print e.message

小结

购买实例之前可以在价格界面搜索一下满足自己需求最低价格的实例类型,或者自行编写搜索脚本。这样您可以买到最实惠的机器,尽量为您节省成本。

【产品功能】价格信息支持下载相关推荐

  1. PHP开发网易云FM音乐试听程序源码+支持下载功能

    正文: PHP开发网易云FM音乐试听程序源码+支持下载功能,如果您有编程开发能力,可以自己修改源码中的代码,但是不要使用记事本修改,因为会造成编码和一些其它不可预料的错误. 如果你需要更换API接口, ...

  2. Android之实现长按Webview页面文字自定义复制、全选、分享、搜索、翻译功能(支持多语言,博文也有Demo下载地址)

    1 需求和效果爆照 浏览器app封装了Webview,然后实现实现长按Webview页面文字自定义复制.全选.分享.搜索.翻译功能(支持多语言),都在自己的浏览器app里面进行搜索和翻译,不跳到系统浏 ...

  3. 【新功能】SAP Learning Hub部分电子书支持下载啦

    体验升级! 部分SAP Learning Hub电子书支持下载,可保存电子版本了! 随时查阅更方便,学习无障碍! 还没有SAP Learning Hub? 私信我们,即刻订阅,立享SAP最新培训资源. ...

  4. 钉钉扫码登录第三方_e签宝联合钉钉升级产品功能,共建企业服务生态闭环

    钉钉微应用更新了,e签宝助力升级.互联网时代下,传统模式的"稳定"已然成为历史,客户的需求在不断变化,我们创新的脚步也从未停止. e签宝携手钉钉,双方着力共建开放.共生.多赢的企业 ...

  5. 袋鼠云产品功能更新报告01期丨用诚心倾听您的需求

    作为一家以"客户第一"为价值观的公司,袋鼠云一直以来关注客户体验,专注提升产品品质,不断收集客户反馈,持续增加新功能并不断优化旧功能,为用户输出最佳产品使用体验.2022年上半年, ...

  6. hpm1216nfh驱动程序_M1216nfh 驱动-HP 惠普 LaserJet Pro M1216nfh多功能一体机驱动下载4.0官方版-东坡下载...

    惠普LaserJet Pro M1216nfh多功能一体机拥有高达600×600dpi的打印分辨率,保证了打印效果的清晰细腻.打印速度方面,得益于0秒预热技术,惠普1216nfh首页输出时间仅为8. ...

  7. BP-Tool 功能介绍,下载地址

    BP-Tool 是 EFTlab 公司开发的主要面向金融和智能卡的数据加解密,数据转换工具 金融领域常用算法如AES RSA DES 都能计算,还能计算DUKPT AES/DES, 以及TR31 KB ...

  8. System Center 2012与vCenter Operations 产品功能对比

    Maturity does not lie in how old you are, but how strong you are to take on responsibilities. 一一一成熟不 ...

  9. Memobus总线光端机产品功能介绍

    Memobus现场总线光纤转换器,提供RS-485串口,符合基于Memobus的串行通信,通信速率4Mbps,单/双光口链网支持.产品支持一路光纤接口,一路总线数据接口,支持两路可级联上下行光纤接口, ...

最新文章

  1. 删除Nifi中的template
  2. linux下kafka与zookeeper集群部署
  3. python中 numpy转list list 转numpy
  4. 米斯特白帽培训讲义 漏洞篇 XSS
  5. 【笔试/面试】—— Linux(块设备与字符设备/cron 和 crontab)
  6. 前嗅ForeSpider教程:采集预览
  7. Windows系统命令整理-Win10
  8. phpQuery使用经验,抓取网页快捷,拒绝正则表达式
  9. 零跑汽车冲刺港股:年营收31亿 去年曾募资88亿
  10. 解决span标签之间的空隙问题
  11. MeeGo开发者(二):MeeGo架构
  12. R语言里的非线性模型:多项式回归、局部样条、平滑样条、 广义相加模型GAM分析
  13. 使用Lanproxy搭建内网穿透服务完整教程
  14. 外卖返利系统|外卖返利系统小程序|外卖系统|返利系统
  15. 【系统美化≤风见幽香热门主题≥win7下载】
  16. vs2019创建c++项目步骤_创建django项目的步骤(超级详细)
  17. android twrp_如何将TWRP Android备份复制到PC以安全保存
  18. java 隐藏侧边栏,hexo干货系列:(八)hexo文章自动隐藏侧边栏
  19. 未检测到ca设备或ca驱动异常_混凝土碳化深度异常原因的探讨
  20. 金山快盘开发 (一)

热门文章

  1. jqGrid使用整理
  2. Python图像处理库:PIL中Image,ImageDraw等基本模块介绍
  3. 关于 TCP 并发连接的几个思考题与试验
  4. C++实用技巧(四)
  5. 带参数二维码如何跟踪用户来自哪个推广人员?
  6. asp.net signalR 专题—— 第二篇 对PersistentConnection持久连接的快速讲解
  7. Android开发之单例模式
  8. 使用元数据设计测试用例
  9. 深圳电信网速测试工具
  10. matlab simulink 电气连接