🛒

EC2のコスト戦略を考えるための前提知識をまとめる

2023/12/15に公開

Fusicの@maimyです。
この記事はFusic Advent Calendar2023の15日目の記事です。アドカレ2回目投稿!せっかく書いたのでカレンダーを埋めます🥳
前回の記事に引き続き、EC2のあれこれの話です。
試験勉強をしていて「フリートって結局何?」となったことから、EC2フリートについて調べてその流れでインスタンスの購入について学びました。
そこで今回はコスト戦略のために最低限おさえるべき前提知識として、EC2インスタンスの購入オプションとインスタンスフリートについてまとめます。

話すこと

  • インスタンスの購入オプションについて
  • EC2インスタンスフリートの概要

こういうのがあるんだな〜ということをまとめます。

話さないこと

  • 具体的なコスト戦略の手法、ベストプラクティスの内容について(参考資料のリンクのみ)

インスタンスフリートとは

フリート(fleet)とは「 艦隊」を意味します。
EC2におけるフリートとは、起動するインスタンスの種類(特にオンデマンドとスポット)・組み合わせをお好みの構成で設定したグループのことです。艦隊も構成によって強さが変わるように、EC2もインスタンスの構成次第でコスト最適化ができます。ビジネスにおいて欠かせないコスト戦略のための機能の一つ、それがフリートです。

EC2の購入オプション

コストを考えるために、まず購入オプションについて整理します。

オンデマンドインスタンス

使った分だけ支払う一般的な従量課金制のインスタンス。

リザーブドインスタンス(RI)

1年・3年の契約で決まったキャパシティのインスタンスを購入することで大幅な割引(最大72%)が適用される。オンデマンドとは異なり決まった容量をあらかじめ購入するので、これだけは使用見込みがあるという場合に有用。
どのリージョンのどのファミリー、どのサイズ…といった種類も決めた上で必要な分を購入する。

SavingPlans

RIの後継にあたり、より柔軟にキャパシティを予約できる。具体的には、RIではインスタンスの種類を決めていたがSavingPlansではその指定が必要ない。代わりに、金額ベースでまとめて購入する。(例:1年で1.00ドル分を購入。)
参考:
https://dev.classmethod.jp/articles/ec2-reserved-instances-savings-plans-comparison/

スポットインスタンス

オンデマンドインスタンスや予約インスタンスの基盤となっているハードウェアの空きキャパシティを活用して使用。最大90%の割引。”空いている”という条件のもと使用するため中断の可能性はある。空いていてもったいない部分を超割引で売るよ〜みたいなイメージ。
spot

基本は必要な人が必要なものを買って、将来的に確実に使う分を予約する代わりに割引適用、半端に余っていてもったいない部分も提供が不安定でいいならと割引適用…という売る側(AWS)と買いたい側(AWSユーザー)がお互いにWin-Winなよくある構図です。

どのオプションを選ぶか

オンデマンドインスタンス

  • 負荷が予測不可能なもの(新サービス、スパイクするもの)、ステートフルなもの
    使った分だけ支払いなのでどれだけキャパシティを要するか分からない場合はオンデマンドインスタンスを選択します。また基本的にいつでも安定した稼働が可能なので一貫した処理能力・リソースが必要なステートフルなユースケースに適しています。

リザーブドインスタンス、SavingPlans

  • 長期運用しているなどで安定稼働しているもの、予測可能で必ず必要とされるもの
    1年または3年分をまとめて購入する(その代わりに大幅な割引!)ため、確実に使用するキャパシティが分かっている場合にRIまたはSPを利用することで大幅にコストを削減することが可能になります。

スポットインスタンス

  • 複数のインスタンスタイプを活用できるもの、中断に強い、ステートレスなもの
    提供は空き次第で中断の可能性があるから、中段に強いもの。ステートレスでよいもの。では中段に強いとは?というと例えばコンテナ化されたものだったりデータ分析・処理のワークロード、CI/CDなどです。
    節約効果の高さからスポットインスタンスをうまく活用できることはコスト戦略にかなり有用です。AWSからもスポットインスタンス活用のベストプラクティスが出ています。

https://aws.amazon.com/jp/ec2/spot/getting-started/

EC2フリートの設定

  • オンデマンドインスタンスとスポットインスタンスの割合
    EC2フリートでは、インスタンスのグループのうちどれだけをオンデマンドにしてどれだけをスポットにするかを指定します。

  • スポットインスタンス
    スポットインスタンスが起動時にどこのインスタンス(スポットプール)を選ぶかという配分戦略を設定できます。簡単に言うと、価格優先か起動しやすさ優先か、です。

    • 価格最優先だが中断可能性の大きい lowest-price
    • 起動しやすさのみ考慮して最も中断しにくいスポットプールから起動する capacity-optimizes
    • 起動しやすさを考慮するが同等の複数プールがあった場合にインスタンスタイプの優先順位を指定できる capacity-optimized-prioritized
    • 価格が低い+起動しやすさの組み合わせでバランスの取れた起動が可能な price-capacity-optimized(推奨)
      参考:

https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Six-Best-Practices-For-EC2-Spot_0430_v1.pdf

インスタンスタイプサイズ容量の再調整など上記の他にも設定できることがいくつかあります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-fleet-configuration-strategies.html

AutoScalingGroupという選択肢は?

オンデマンドインスタンスとスポットインスタンスの配分を決めてインスタンスのグループを作る、というとAutoScalingGroupも同じです。
これらは目的が違います。
フリートは様々な種類のインスタンスサイズ・タイプ・購入オプションの複数インスタンスをまとめて一括管理。
AutoScalingGroupは負荷に応じた自動スケール。
AutoScalingも負荷変動のあるケースでのコスト最適化と安定稼働には有用ですが、様々なインスタンスを組み合わせて複雑な設定管理も行いながらコスト・パフォーマンスを最適化する戦略のためにはフリートが適していると考えられます。
AutoScalingはインスタンス台数を維持するため、スポットインスタンスの中断に備えるという部分を任せることができます。
管理は複雑になりますが、EC2フリートとAutoScalingGroupを組み合わせて使用することで負荷変動が大きく大規模なアプリケーションでコストを最適化した設計も可能になります。

リザーブドインスタンスやSavingPlansをフリートに組み込めないの?

…と、私は疑問に思いました。
EC2フリートはあくまでオンデマンドインスタンス+スポットインスタンスの割合と起動方法、起動中の挙動などを設定するものです。
RIやSPは「 固定費」なので、その時々の需要に合わせたインスタンスのグループ=「 変動費」を柔軟に管理するフリートとは別で考えた方がよいのだと考えました。
例えると家計管理でもそうであるように、固定費は固定費、変動費は変動費でそれぞれ節約の方法が異なります。しかしこれらを総合的に考えることでより最適化されたコスト戦略が実現できます。

cost

まとめ

EC2の購入タイプ、複数インスタンスの管理によるコスト・パフォーマンス最適化について調べてみると家計管理に近いものがあると思いました。
購入タイプはAWSとユーザーでWin-Winの関係で提供されている点はまさに売り手と買い手の関係、そして買い方(オンデマンドとスポットの割合、その他設定などの管理)をうまく使うことで節約していく。

  • 決まって使う分は固定費としてコスト削減=リザーブドインスタンス、SavingPlans
  • 変動する分は必要最小限の最適なコストで購入して負荷(需要)に対応する=EC2フリート、AutoScalingGroup

これらを組み合わせて管理することはとても複雑ですが、同時におもしろい部分でもあると感じました。
ベストプラクティスがあったり設定が多岐に渡っていたりと奥が深い世界なので、これからその都度でコスト面・ビジネス面の考慮とそれを実現する選択肢は必ずあるということを頭に入れておこうと思います。

GitHubで編集を提案
Fusic 技術ブログ

Discussion