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

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 本文主要解读了实例,磁盘,带宽价格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

小结

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

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情:&nbsp;https://www.aliyun.com/product/ecs
相关文章
|
1月前
多功能知识付费源码
资源变现类产品的许多优势,并剔除了那些无关紧要的元素,使得本产品在运营和变现能力方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。
31 1
多功能知识付费源码
|
4月前
|
弹性计算 Linux Windows
如何升级计算巢服务实例版本,从而支持更便捷、可视化的游戏配置
现在你可以参考这篇教程,将之前老版本的幻兽帕鲁计算巢服务,升级到最新版本,支持最新版本的管理配置界面。包括修改游戏配置、重启游戏、存档管理等功能。
2654 2
如何升级计算巢服务实例版本,从而支持更便捷、可视化的游戏配置
|
2月前
|
机器学习/深度学习 人工智能 开发工具
视觉智能平台常见问题之设置默认使用单类目资源包而不是通用资源包如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
15 1
|
7月前
|
云安全 运维 安全
阿里云安全产品购买详细介绍_版本_价格_功能优势
阿里云安全产品购买详细介绍_版本_价格_功能优势,云安全中心基础版免费、防病毒班432元一年、高级版优惠价969元一年,还有企业版和旗舰版可选,阿里云百科分享阿里云安全中心详细介绍,包括云安全中心功能、不同版本价格表以及有必要购买说明
130 0
|
3月前
|
小程序 IDE API
社区每周丨小程序基础库更新至 2.8.21及小程序商品新增商品营销功能(9.11-9.15)
社区每周丨小程序基础库更新至 2.8.21及小程序商品新增商品营销功能(9.11-9.15)
138 1
|
iOS开发 MacOS Windows
无影产品动态 | 客户端6.2.0版本发布,操作更顺畅,体验更丝滑
本次更新优化了核心功能模块“云电脑助理”,新增云电脑UI缩放(DPI)配置功能,用户远程协助申请和用户共享协同功能,有效简化操作步骤,提升产品体验。
259 0
无影产品动态 | 客户端6.2.0版本发布,操作更顺畅,体验更丝滑
|
文字识别 JavaScript 前端开发
品类超全的热门免费可用 API 汇总
品类超全的热门免费可用 API 汇总
137 0
品类超全的热门免费可用 API 汇总
|
存储 文字识别 API
分享:推荐免费可用的 API 大全,品类超齐全
分享:推荐免费可用的 API 大全,品类超齐全
175 0
|
存储 文字识别 API
梦的解析 —— 周公版,包括【周公解梦】在内的超多免费可用 API 推荐(二)
梦是人们日常生活中经常出现的现象,人们对梦的解析一直是一个重要的研究领域。周公解梦是中国古代传统文化中的一部分,它对于梦的解析提供了很多有价值的参考,成为了梦解释的重要参考工具之一。
208 0
梦的解析 —— 周公版,包括【周公解梦】在内的超多免费可用 API  推荐(二)
|
小程序
功能更新 - 阿里云商标查询小程序全面升级
小云提醒:文末有惊喜福利,走过路过不要错过~
429 0
功能更新 - 阿里云商标查询小程序全面升级

热门文章

最新文章