亚马逊AWS官方博客

如何自动化的选择和优化EC2系列(五)如何整合RI续购日期

需求背景

看过以前四篇文章的介绍,作为一个云平台的管理人员,我想你应该非常熟悉如何做年度的EC2实例优化了,那么下面你一定会根据优化结果开始准备购买下一年的RI了。但是在很多企业中,由于的历史原因,并不是所有的RI都是在同一天购买的,也就是说,RI的到期日分布在不同的月份和不同的日子,这样一批一批的购买是不是很繁琐呢?你也许会脑洞大开的想,我能不能选择日期临近的RI合并一起购买呢?这样就可以通过逐步减少购买RI的批次从而逐步增加每个批次的数量,合并以后可以省去很多麻烦。

但是选择在哪一天集中购买会更加经济呢?仔细想想,并不是每天的成本都是一样的。我们举个例子,你有30个EC2 instance,最早过期日和最晚过期相差2个月,一共有6个批次。那么究竟选择哪一天集中购买最划算呢?

方案概述

要计算出哪一天购买最划算,我们需要分析一下我们所做决定的成本构成:

假设我们选择在第X天购买,对于任何一个EC2, 在整个批次的RI购买周期内(从最早RI到期日至最晚RI到期日)有以下三部分成本:

1. 原有机型RI的成本,

假设原有的RI在第Y天到期,如果在第X天购买新的RI,则浪费了:

(X-Y)* 原有机型RI每日成本

如果X-Y<=0, 则这部分成本为0

2.新机型RI的成本

(RI购买周期-X)*新机型RI每日成本

如果(RI购买周期-X)<=0,则这部分成本为0
3.On-Demand 成本

假设原有机型RI在第Y天到期,而我们在第X天购买了新机型的RI,则从第Y天到第X天会以On-Demand的价格收取原有机型的费用

(Y-X)*原有机型On-Demand每日价格

如果Y-X<=0, 则这部分成本为0

 

我们要做的就是将每台EC2的这三部分成本加起来,选择一个合适的日子,使这三部分的成本之和最小。

 

我们使用第三篇文章介绍的优化方法生产的优化结果文件作为输入,输入的Excel的每条记录需要包含如下信息:

ri_expired_date target_price source_price source_ondemand

ri_experied_date:源系统EC2 RI的到期日(日期类型)

target_price:目标EC2的一年标准RI实例价格

source _price:源EC2的一年标准RI实例价格

source _ondemand:源EC2的On-Demand实例价格(每小时)

示例输入文件的格式如下:

上面的结果显示总计有52台服务器,原来分了7个批次购买RI,最早到期日是5月21日,最晚到期日是6月12日。我们要计算的是如果这52台服务器今年一起购买RI,那么在哪一天购买最划算?

下面这个Python 程序(ri_plan.py)就是根据上述方案阐述的思路编写的,可以很好地解决这个问题。

import pandas as pd

from datetime import *

from datetime import date

from datetime import datetime


table = pd.read_excel("blog5_output.xlsx")

start_day = min(table['ri_expired_date']).date()

end_day = max(table['ri_expired_date']).date()

duration = (end_day - start_day).days

total_item = table.shape[0]

cost = []

for x in range(0, duration + 1):

    sub_total = 0

    for i in range(0, total_item):

        current_item_date = (table.loc[[i]].ri_expired_date)[i].date()

        # old price duration

        op_day = ((current_item_date - start_day).days) - x

        # on demand price duration

        od_day = x - ((current_item_date - start_day).days)

        # new price duration

        np_day = (duration - x)

        if op_day < 0:

            op_day = 0

        if od_day < 0:

            od_day = 0

        sub_total += ((table.loc[[i]].source_price)[i] / 365 * op_day + (table.loc[[i]].target_price)[i] / 365 * np_day + (table.loc[[i]].source_ondemand) * od_day * 24)[i]

    cost.append(sub_total)

optimize_cost = min(cost)


print("{}   {}".format('    Date', '    Cost'))

for i in range(0, len(cost)):

    if cost[i] == optimize_cost:

        recommand_date = start_day + timedelta(days=i)

    current_date = start_day + timedelta(days=i)

    current_date = datetime.combine(current_date, datetime.min.time())

    print("{}   {:.2f}".format(current_date.strftime('%Y-%m-%d'), cost[i]))

print ('\nRecommanded date to buy RI is {}'.format(recommand_date))

 

运行后的结果如下:

$ python ri_plan.py
    Date       Cost
2019-05-21   135170.43
2019-05-22   129999.90
2019-05-23   124917.96
2019-05-24   119982.30
2019-05-25   115046.64
2019-05-26   110110.98
2019-05-27   105175.32
2019-05-28   100239.65
2019-05-29   102823.48
2019-05-30   105407.30
2019-05-31   107991.12
2019-06-01   110574.95
2019-06-02   113158.77
2019-06-03   115742.59
2019-06-04   118326.42
2019-06-05   127722.57
2019-06-06   137703.24
2019-06-07   147683.91
2019-06-08   157664.58
2019-06-09   167645.26
2019-06-10   177625.93
2019-06-11   187606.60
2019-06-12   197587.27

 Recommended date to buy RI is 2019-05-28

 

从上述运行结果可以看出,5月28日购买RI是最好的选择。

 

本文中的完整程序可从这里下载:

https://github.com/shaneliuyx/awscnprice/tree/master/examples

————

如何自动化的选择和优化EC2系列(一)利用AWS Price List API生成中国区的EC2 价格表

如何自动化的选择和优化EC2系列(二)在迁移项目中,如何自动选择最经济的EC2

如何自动化的选择和优化EC2系列(三)如何进行EC2优化,进一步优化成本

如何自动化的选择和优化EC2系列(四)如何为SAP应用选择合适的EC2

如何自动化的选择和优化EC2系列(五)如何整合RI续购日期(本博文)

本篇作者

刘育新

AWS ProServe 团队高级顾问,长期从事企业客户入云解决方案的制定和项目的实施工作。