【产品功能】价格信息支持下载
生活随笔
收集整理的這篇文章主要介紹了
【产品功能】价格信息支持下载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
背景
目前阿里云的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.國內站,控制臺界面
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.json3.日本站,控制臺界面
實例: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小結
購買實例之前可以在價格界面搜索一下滿足自己需求最低價格的實例類型,或者自行編寫搜索腳本。這樣您可以買到最實惠的機器,盡量為您節省成本。
總結
以上是生活随笔為你收集整理的【产品功能】价格信息支持下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用My97DatePicker实现年份
- 下一篇: 洛谷P2518 [HAOI2010]计数