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

简介: 本文主要解读了实例,磁盘,带宽价格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

小结

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

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
小程序 定位技术 API
【社区每周】小程序码支持沙箱调试;开发文档新增产品地图(1月第二期)
【社区每周】小程序码支持沙箱调试;开发文档新增产品地图(1月第二期)
46 0
|
6月前
|
移动开发 小程序
知识付费小程序注册时类目该如何选择?
知识付费小程序注册时类目该如何选择?
|
6月前
|
弹性计算 Linux Windows
如何升级计算巢服务实例版本,从而支持更便捷、可视化的游戏配置
现在你可以参考这篇教程,将之前老版本的幻兽帕鲁计算巢服务,升级到最新版本,支持最新版本的管理配置界面。包括修改游戏配置、重启游戏、存档管理等功能。
如何升级计算巢服务实例版本,从而支持更便捷、可视化的游戏配置
|
6月前
|
监控 小程序 安全
社区每周丨支付有礼支持引导用户收藏小程序及人脸认证接口更新(8.7-8.11)
社区每周丨支付有礼支持引导用户收藏小程序及人脸认证接口更新(8.7-8.11)
175 11
|
6月前
|
小程序 IDE 定位技术
【社区每周】小程序支持预拉取地理位置;验收工具组件集成至“商家券”等产品文档(11月第五期)
【社区每周】小程序支持预拉取地理位置;验收工具组件集成至“商家券”等产品文档(11月第五期)
71 11
|
存储 弹性计算 负载均衡
阿里云新增新老用户多场景组合购,多种业务场景可选,灵活选择解决方案
很多购买阿里云产品的用户在购买云服务器产品的同时往往还需要搭配购买其他云产品,例如备案管家服务、对象存储服务、负载均衡CLB、无影云桌面等,为此,阿里云新增了组合购套餐,最低仅需1532.04元起。
阿里云新增新老用户多场景组合购,多种业务场景可选,灵活选择解决方案
|
文字识别 JavaScript 前端开发
品类超全的热门免费可用 API 汇总
品类超全的热门免费可用 API 汇总
164 0
品类超全的热门免费可用 API 汇总
|
小程序
功能更新 - 阿里云商标查询小程序全面升级
小云提醒:文末有惊喜福利,走过路过不要错过~
523 0
功能更新 - 阿里云商标查询小程序全面升级
|
存储 对象存储
阿里云快照收费标准(2023新版报价)
阿里云快照收费标准(2023新版报价),阿里云服务器快照价格按量付费每小时扣费,快照费用是按照快照所占用的存储空间大小计费的,普通快照1GB价格为0.12元/GB/月,阿里云百科分享2023阿里云服务器快照收费标准:
阿里云快照收费标准(2023新版报价)