AWS: оптимизация расходов – покупка и анализ RDS Reserved Instances

Автор: | 16/04/2021
 

Сейчас активно внедряю решения по уменьшению расходов на инфрастуктуру AWS, решил закинуть пару постов на эту тему.

Первым будет тема AWS RDS Reserved Instances. Суть проста: вы обязуетесь использовать определённые инстансы один или три года. При этом есть возможность как оплатить их использование сразу на весь период – тогда скидка будет больше, либо частично, либо без предоплаты вообще – в таком случае с вас каждый час просто будет сниматься сумма, на которую коммититесь при покупке серверов (“резервации инстансов”).

Аналогичное решение для AWS EC2 – Saving Plans (хотя и для них существуют EC2 Reserved Instances, но AWS переходит на использование Saving Plans как основного решения). Saving Plans для RDS, думаю, в скором времени появится тоже. AWS EC2 Saving Plans рассмотрим подробнее в следующем посте – мы ими уже активно пользуемся, и они тоже реально помогают экономить.

Учтите, что Reserved Instances работают для конкретного региона, в котором она приобретается, на определённое семейство инстансов и на их количество.

Посмотрим наши текущие расходы, что бы определить сколько и куда мы сейчас тратим.

Анализ расходов AWS RDS

Переходим в Cost Explorer, в Filters выбираем RDS, и смотрим расходы по типам инстансов:

Больше половины, 111 USD/day, у нас уходит на инстансы типа r5.2xlarge – это наши Production сервера AWS RDS Aurora-кластеров, и их тип меняться не планируется – вполне тянут текущие нагрузки. Значит – есть смысл в их резервации (посмотрим, сколько серверов брать).

AWS Cost Explorer: RDS No Instance type

Вторая крупная часть расходов – No Instance type, 37 USD/day.

Что бы узнать, что это за расходы – переключаем Group by с Instance type на Usage type:

Тут видим ещё три опции, за которые начисляется оплата – Aurora:StorageIOUsage – 16 USD, Multi-AZUsage:db.t2.xlarge – 14 USD, RDS:ChargedBackupUsage – ещё 8 USD, плюс по мелочи аналогичные расходы (толковый пост – Tips and Tricks for Exploring your Data in AWS Cost Explorer).

Их уменьшить с помощью Reserved Instances мы не можем, поэтому пропускаем.

Возвращаемся к Group: InstanceType, смотрим оставшиеся инстансы – db.r5.large 27 USD/day, db.t2.xlarge – 14 долларов.

Переходим в RDS, считаем количество каждого типа инстанса:

  • db.r5.2xlarge:
    • USA-2 region: Production кластер, 4 штуки + Aurora ReadReplica AutoScaling
  • db.r5.large:
    • USA-2 region: Dev и Stage кластера, 4 штки
  • db.t2.xlarge:
    • EU-3 region: аналитика Production, 1 сервер

Есть смысл пока взять в Ohio db.r5.2xlarge 4 штуки – менять эти сервера в ближайшем времени не планируем.

Size-flexible reserved DB instances

См. документацию тут>>>.

Ещё один нюанс, который стоит учитывать: при покупке резерваций на конкретный тип инстанса, в нашем случае это 2xlarge, эта скидка будет распространяться на всё семейство r5, которые мы покупаем. Т.е. и на r5.large, и на r5.4xlarge, если такие появятся в будущем.

В этом плане EC2 Saving Plans, конечно, более удобны и очевидны, надеюсь, их таки прикрутят и для AWS RDS.

Вернёмся к нашим баранам серверам.

Итак, Dev и Stage кластера могут меняться, поэтому их пока не трогаем – r5.large не покупаем, но позже увидим их на графиках – скидка с r5.2xlarge будет распространяться и на них.

Смотрим в Billings:

“USD 1.16 per RDS db.r5.2xlarge”, за 13 дней Апреля отработали суммарно 1168 часов, что обошлось нам в 1355 долларов, проверим:

[simterm]

>>> 1355/1168.0
1.16

[/simterm]

Смотрим цены на инстансы – db.r5.2xlarge стоит 1,16 доллара за час, тут всё сходится.

В месяц 1 инстанс обходится в:

[simterm]

>>> 1.16*24*30
835.19

[/simterm]

В год:

[simterm]

>>> 1.16*24*30*364
304012.8

[/simterm]

Запомним эти цены – сейчас посмотрим, что нам покажут при покупке резерваций.

Покупка Reserved Instances

Переходим в RDS – Reserved instances, кликаем Purchase Reserved DB Instance:

Смотрим цены на инстансы – db.r5.2xlarge, Offering type – No Upfront:

0.760 USD (hourly) – это в месяц получается 547 долларов, или 199180 за год (сейчас, как помним, они нам обходятся в 835 и 30000 соответственно).

Если же выбрать All upfront, т.е. заплатить за них сразу вперёд, то:

5,541.00 USD, или по:

[simterm]

>>> 5541/364/24
0.63

[/simterm]

0,63 доллара в час – цена ниже практически вдвое!

Либо можно не мучаться с калькулятором, а просто использовать AWS Pricing Calculator, и посмотреть расчёт за месяц при использовании On Demand – 846 долларов:

При No upfront – 554 доллара:

И при All upfront – 5541 за год, т.е. 461 в месяц:

Собственно – как мы и считали с калькулятором.

Дальше осталось только зарезервировать 4 инстанса r5.2xlarge:

И подождём пару дней, что бы увидеть насколько уменьшится расход.

Результаты покупки RDS Reserved Instances

Превой неожиданностью стало то, что AWS снял сумму за резервации на следующий день и до конца месяца, хотя судя по документации (да и на скришоте выше – “will charge $0.00”), и так как выбирался “No upfront“, ожидалось, что будет чаржить каждый час, как при использовании EC2 Saving Plans, а не наперёд:

В документации по резервациям RDS этого не сказано, но есть в документации к EC2 Reserved Instances:

13 число, до конца месяца осталось 17 дней, считаем:

[simterm]

>>> 1343/17/4/24.0
0.82

[/simterm]

0.82 доллара.

Если вычтем примерно 100 долларов за сервера, которые не покрыты резервациями (см. скрин ниже, за 14-е число) – то получим как раз 0.76 доллара за час работы каждого зарезервированного инстанса:

[simterm]

>>> (1343-100)/17/4/24.0
0.7616421568627452

[/simterm]

Итак, резервации заработали, что стало хорошо видно на графиках за 14-е число:

Либо можно переключиться на почасовое отображение, и увидеть в графиках ещё за 13-ое.

Полезными могут быть графики по AWS Cost Management > Reservations > Utilization report – посмотреть, насколько используются наши 4 зарезервированных инстанса:

Все 4 наши резервации r5.2xlarge  используются на все 100%, и тут же видим, сколько мы сэкономили: 111 долларов было бы при использовании On Demand инстансов, 72 мы заплатили за резервации, 38 в день сэкономили.

А вот Coverage report говорит, что мы покрываем не все расходы на r5, так как, как помним – Size-flexible reserved DB instances покрывает расходы на всё семейство r5 в регионе, а у нас ещё 4 штуки обычных r5.large, и часть резерваций покрывает их:

И это же видно в Cost explorer running hours costs and usage:

Плюс – автоскейлинг Aurora, где иногда создаются read-replicas, которые хоть и живут недолго, 10-15 минут, но каждый инстанс билится за час.

В общем – RDS Reserved Instances штука приятная, экономить помогает значительно, хотя местами не слишком очевидная и удобная.

В этом плане EC2 Saving Plans лучше и гибче, о чём и поговорим в следующий раз.