【产品功能】价格信息支持下载

简介: 本文主要解读了实例,磁盘,带宽价格JSON的结构,介绍了各站点的下载地址,给出了一种搜索最低价格的方式。

背景

目前阿里云的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):
                continue
        if (instanceType != None):
            if (instanceType not in key):
                continue
        if (networkType != None):
            if (networkType not in key):
                continue
        if (osType != None):
            if (osType not in key):
                continue
        if (ioType != None):
            if (ioType not in key):
                continue
        filterPricingInfo[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 / period
    if priceUnit == "weeks":
        return price / 7 * 30 / period
    if priceUnit == "months":
        return price / period
    if 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, 0
            if result != None:
                monthPriceResult = get_month_price(result, result["priceUnit"])
                monthPrice = get_month_price(priceItem, priceUnit)
            if (monthPrice <= monthPriceResult or result == None):
                result = priceItem
                result["priceUnit"] = priceUnit
                result["pricingKey"] = pricingKey
    return 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 = False
            for 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 = True
                        break
            if 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 = None
    priceJson = 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 result


if __name__ == '__main__':
    url = "https://g.alicdn.com/aliyun/ecs-price-info/2.0.6/price/download/instancePrice.json"
    regionId = None
    instanceType = "ecs.g5.2xlarge"
    # vpc classic
    networkType = None
    # linux windows
    osType = None
    # optimized none
    ioType = None
    # hours weeks months years
    priceUnit = None
    # 1-5
    period = None
    try:
        print json.dumps(query_min_price(url, regionId, instanceType, networkType, osType, ioType, priceUnit, period))
    except RuntimeError, e:
        print e.message

小结

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

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
前端开发 开发工具 数据库
支付系统资料-青戈版沙箱支付,订单编号样式设计,还有七天无理由退款,常与会员系统相搭配,内网穿透客户看到页面,前端展示,直播过程所有都能访问的写法
支付系统资料-青戈版沙箱支付,订单编号样式设计,还有七天无理由退款,常与会员系统相搭配,内网穿透客户看到页面,前端展示,直播过程所有都能访问的写法
支付系统资料-青戈版沙箱支付,订单编号样式设计,还有七天无理由退款,常与会员系统相搭配,内网穿透客户看到页面,前端展示,直播过程所有都能访问的写法
|
云安全 运维 安全
阿里云安全产品购买详细介绍_版本_价格_功能优势
阿里云安全产品购买详细介绍_版本_价格_功能优势,云安全中心基础版免费、防病毒班432元一年、高级版优惠价969元一年,还有企业版和旗舰版可选,阿里云百科分享阿里云安全中心详细介绍,包括云安全中心功能、不同版本价格表以及有必要购买说明
300 0
|
6月前
|
机器学习/深度学习 人工智能 开发工具
视觉智能平台常见问题之设置默认使用单类目资源包而不是通用资源包如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
|
6月前
|
监控 小程序 安全
社区每周丨支付有礼支持引导用户收藏小程序及人脸认证接口更新(8.7-8.11)
社区每周丨支付有礼支持引导用户收藏小程序及人脸认证接口更新(8.7-8.11)
175 11
|
6月前
|
小程序 IDE API
社区每周丨小程序基础库更新至 2.8.21及小程序商品新增商品营销功能(9.11-9.15)
社区每周丨小程序基础库更新至 2.8.21及小程序商品新增商品营销功能(9.11-9.15)
177 11
|
存储 弹性计算 负载均衡
阿里云新增新老用户多场景组合购,多种业务场景可选,灵活选择解决方案
很多购买阿里云产品的用户在购买云服务器产品的同时往往还需要搭配购买其他云产品,例如备案管家服务、对象存储服务、负载均衡CLB、无影云桌面等,为此,阿里云新增了组合购套餐,最低仅需1532.04元起。
阿里云新增新老用户多场景组合购,多种业务场景可选,灵活选择解决方案
|
存储 监控 安全
阿里云存储简介和购买流程
阿里云存储是阿里巴巴集团旗下的一项云计算服务,为用户提供可靠、安全、弹性扩展的云存储解决方案。通过阿里云存储,用户可以高效地管理、存储和传输各类数据。 阿里云存储的核心功能包括对象存储、文件存储和块存储。对象存储是一种分布式存储模型,适用于存储海量非结构化数据,如图片、视频等。文件存储提供了类似于传统文件系统的共享存储服务,可方便地共享和访问文件。块存储则为云服务器提供了持久性的块级存储设备,可挂载到云服务器上使用。
|
存储 文字识别 API
梦的解析 —— 周公版,包括【周公解梦】在内的超多免费可用 API 推荐(二)
梦是人们日常生活中经常出现的现象,人们对梦的解析一直是一个重要的研究领域。周公解梦是中国古代传统文化中的一部分,它对于梦的解析提供了很多有价值的参考,成为了梦解释的重要参考工具之一。
279 0
梦的解析 —— 周公版,包括【周公解梦】在内的超多免费可用 API  推荐(二)
|
小程序
功能更新 - 阿里云商标查询小程序全面升级
小云提醒:文末有惊喜福利,走过路过不要错过~
524 0
功能更新 - 阿里云商标查询小程序全面升级