Septeni Engineer's Blog

セプテーニ・オリジナルのエンジニアが綴る技術ブログ

Amazon EC2 リザーブドインスタンス調査

節約大好き、中途三年目になりました堀越です。

サーバーコストは地味に痛いですよね。
コスト削減活動の一貫として既存プロダクトをリザーブインスタンス(以下、RI)に、
乗せる動きとなっています。

とはいうものの、前提としてあまりRIの知識があまりなかったので、
技術調査ついでにアウトプットすることとしました。

RIに関するエントリは既に多く出ていますが、そのあたりはご了承くださいませ。

What's RI?

オンデマンドインスタンスの利用料金に対し、大幅な価格割引をしてくれるサービスです。
うまくやれば最大なんと75%の適用が実現できます。

特定のアベイラビリティーゾーンで使用するキャパシティーを予約して、
リソースの枯渇に対策など可能です。

補足ですが、RIは単一のインスタンスではなく、
複数および、分割・統合可能なインスタンスを購入しておいて、
オンデマンドインスタンスの利用料金から割り引いた額を請求してもらうサービスです。

下記エントリの定期券に例えた解説が大変わかりやすかったです。
dev.classmethod.jp

購入方法

マネジメントコンソールもしくは、APIから購入可能です。
購入元に AWS もしくは 3rd Party の販売者 *1 の選択が必要です。

購入における注意点

販売元が 3rd Party の場合は税務上の都合で、
市区町村、県や州、郵便番号が販売者に開示されてしまうとのこと。

また、購入料金の払い戻しは不可なのでお買い物は慎重に。
リザーブドインスタンスの購入方法

RIの購入オプション

購入時に、支払い方法期間提供タイプ を選択します。

支払い方法

3つに支払いプランを選択できます。

  • 前払い無し
  • 一部前払い
  • 全前払い

期間

2つの利用期間を選択できます。

  • 1年間
  • 3年間

提供タイプ

2つの提供タイプを選択できます。

  • スタンダードタイプ
  • コンバーティブルタイプ
それぞれの相違点

f:id:t_horikoshi:20181101200209p:plain

コンバーティブルタイプはファミリーやOSを変更できるところが柔軟ですね。
いっぽうで、スタンダードプランは割引率が高く、マーケットプレイスで売りに出せる利点があります。

リージョンRIとアベイラビリティーゾーンRI

スタンダードRI、コンバーティブルRIのいずれも、
特定のリージョン、もしくはアベイラビリティーゾーン内のインスタンスに割引の適用が可能です。

それぞれリージョンRI、ゾーンRIと呼称されているようです。

アベイラビリティーゾーンに適用するメリット

予めキャパシティを確保しておきAWS内のリソースが枯渇した際、
優先的にリソースを提供してくれる。

リージョンに適用するメリット

割引適用の違いについては、後ほど RIの適用について の項で詳しく説明します。

例. Linux t3.nano を購入した場合の割引イメージ

f:id:t_horikoshi:20181101203811p:plain
*2

全前払い、3年間を選択したほうが割引率が上がるみたいですね。

クレジットを切る際に、一括払いにするか、リボ払いにするかで請求額が変わることを考えると、
なるほどなーという感じです。

RIの購入制限

RIは1ヶ月あたりに購入できる数が限られており、
1リージョンあたり20個、1アベイラビリティーゾーンあたり20個までという制限があります。

仮に、東京リージョン内で3つのアベイラビリティーゾーンとした場合は、
最大で80個のRIを購入できるということになります。

f:id:t_horikoshi:20181101222201j:plain

請求方法

お客様がリザーブインスタンスとオンデマンドインスタンスの両方をご利用の場合、ご請求額が最小となるようにリザーブインスタンス料金が先に適用されます。リザーブインスタンス期間が終了するまでの各時間について、低い時間単価で計算したご利用料金をお支払いいただきます(つまり、1 時間まったく使用しないことがあったとしても、その時間の分の料金が請求されます)。ある 1 時間のあいだに、実行されたインスタンスの数がお客様の保有する適用可能なリザーブインスタンスの数を超過した場合は、オンデマンド料金が適用されます。

*3

利用時間で計上されるので使った分だけ請求が発生する仕組みのようです。

オンデマンドインスタンスと両方を利用していた場合は、
保有してる分のRIの料金を適用していい感じに安くなるようにやってくれるあたり、
ありがたいですねー。

なお、インスタンス利用数がRIの保有数を超過すると、
オンデマンド料金が発生する仕組みになっています。

RIの適用について

リザーブインスタンスは購入した時点で即時適用されるのが利点ですが、
リージョンRIとゾーンRIとでは適用のされ方に若干異なりがあるようです。

docs.aws.amazon.com

ゾーンRIの適用

インスタンス属性が一致しないと割引が適用されない

割引を適用するには同じAZ内のインスタンスと属性が一致していなければならないそうです...。

テナンシー、プラットフォーム、アベイラビリティーゾーン、インスタンスタイプ、およびインスタンスサイズが、同じでなければならないということでちょっと面倒だなという感想です。

リージョンRIの適用

インスタンスタイプを合わせていればサイズが違っていても割引対象となる

インスタンスタイプを合わせていれば同一リージョン内のインスタンスに適用を勝手にさばいてくれるので、
適用の柔軟性の観点だと圧倒的にこっちのが楽ですね。

この柔軟性は正規化係数という概念によって実現されており、
インスタンスのサイズが大きければ比例して正規化係数も増加して、分割利用率が上がる仕組みです。

AWS Cost Explorer による RI 購入の最適化

これまで、長々とRIの提供タイプや種類について語ってきましたが、
細々考えるの面倒だよなーっというのが本音です。

ブログ投稿前に教えていただいたのですが、
AWS Cost Explorer というサービスを使えば過去のオンデマンド利用料から最適なRIの組み合わせを
サジェストしてくれるということでした。

docs.aws.amazon.com

へー、めっちゃ便利。
実際に購入時を進めていく際、AWS Cost Explorer の利用は必須になりそうです。

RIの販売

インスタンス上で動かしてるサービスの終了などの都合で、
不要になった分のRIをマーケットプレイスに売りに出すことができます。

制約と制限

  • 販売に出せるのはスタンダードRIのみ
  • RIの予約がアクティブの状態でないと販売ができない
  • 出品内容の変更不可
    • 変更する場合は出品を取り消して、再登録する

特典

前払いしていた分の12%を販売価格につけてくれる とのこと。
地味に嬉しいですね。

まとめ

  • 常時稼働のインスタンス保有しているならRI買ったほうが断然お得。
  • AWS or 3rd Party 販売者から購入可能。
  • 支払い方法や、購入オプションによって割引率が変動する。
  • スタンダードは割引率高めでいらなくなったら販売に出せる。
  • コンバーティブルは割引率下がるし販売に出せないけどはファミリーやOSを変更可能。*4
  • アベイラビリティゾーンRIはキャパシティの予約が可能。
  • リージョンRIはインスタンの属性が異なる場合でも自動で適用してくれる。
  • 購入時は必ず AWS Cost Explorer を使って最適化しよう。

終わりに

弊社では、一部RIを適応しているプロダクトはあるものの、
まだまだ、常時稼働しているオンデマンドインスタンスが何台あるのが現状ですので、
そのあたりをなんとかしていきたいです。

ただ、RIの購入オプションや配置の仕方などを計画的にやらないと、
思ったとおりに値引きが効かなくなりそうなので、そのあたりはうまくやらないとダメそうですね。

現在進行系でサーバーに費用を吸われているので早く導入して節約したい気持ちです。

でわ、また。

*1:購入したRIを売りに出してる人

*2:EC2 インスタンス料金 – アマゾン ウェブ サービス (AWS)

*3:リザーブドインスタンスの購入方法の請求方法より。

*4:間もなく販売可能になるらしい

BigQuery で複数の配列をフラット化する

こんにちは、中途で入社してからちょうど丸 1 年がたちました田邊(@emaggame)です。最近は React + TypeScript を利用したフロントエンドや Scala による Web API 開発もそこそこに、Akka Stream によるデータ収集や BigQuery での集計といったこともしており、毎日たのしく過ごしています。

BigQuery、最近さわり始めていろいろできるんだなあと今さらながら感動しているところです。本エントリではちょっとした Tips として、複数の配列を含むレコードをフラット化する方法についてご紹介します。

続きを読む

JSON Codec を楽しもう、現場で役立つ circe

おつかれさまです。
中途2年目の堀越です。

Webアプリケーションなんかを開発していると、
例として Http Request / Response を処理するのに大抵は JSON を扱いますよね。

わたしは Scala を触り始めてから長らく play-json と歩みを共にしてきたのですが、
最近(今更)、circe を触ってみて大変便利でしたので解説を交えながら紹介していこうかと思います。

circe.github.io

続きを読む

【2018年度版】セプテーニ技術読本の無料配布

こんにちは。セプテーニ・オリジナルの池田です。

弊社は3年前よりScalaMatsuriに将軍スポンサーとして協賛しており、毎年「技術読本」をノベルティとして配布しております。

今年で3冊目となりました!


▲ 左から2016年、2017年、2018年度の技術読本

続きを読む