本日も乙

ただの自己満足な備忘録。

【AWS】Savings Plans がどのように適用されるのかを理解する

2019年11月に Savings Plans(以下、SP)という新しい料金体系、割引プランが発表されました。Savings Plans はリザーブドインスタンス(以下、RI)と同じ割引率で、RIよりも柔軟性に富んでいます。EC2 の他に、Fargate、AWS Lambda(以下、Lambda)にも適用できるため、今まで以上にコスト最適化がすすみます。

しかし、柔軟ゆえに Savings Plans の考え方(時間あたりのコミットなど)や適用ルールが RI と異なるため、「コミットメント(購入)したのはいいけど、意図したとおりに適用されていない・・・」といったこともあります(私はありました)。

そこで本記事では Savings Plans がどのように適用されるのかについて解説します。適用例は AWS ドキュメント「Understanding How Savings Plans Apply to Your AWS Usage」を参考に、東京リージョンの料金に合わせています。

また、本記事で解説した内容は自著「Amazon Web Servicesコスト最適化入門(AWS コスト本)」に書いていることと重複しますが、本書は Lambda を含めていなかったので本記事が最新版となります。Savings Plans について詳細に知りたい人は本書を読んでみてください。すでに購入されている方は本書を補完する形でお読みください。

ohsawa0515.booth.pm

目次

リザーブドインスタンス、Savings Plans の適用ルール

RI、SP が混在している場合、RI → EC2 Instance SP → Compute SP の順に適用されていきます。つまりは適用範囲が狭い方が優先されます。RI が適用されないオンデマンド部分に対して SP が適用されます。

  • RI(適用範囲:小)
  • EC2 Instance SP(適用範囲:中)
  • Compute SP(適用範囲:大)

SP の適用ですが、まず、SP のコミットを購入した AWS アカウントから適用されます。AWS アカウント内で適用できず、連結している AWS アカウントが存在している場合は連結の AWS アカウントに適用されます。

複数の EC2、Fargate が存在する場合は、オンデマンドに対する割引率が大きいものから適用されていきます。一般的に EC2 Linux、Fargate、EC2 Windows、Lambda の順に割引率が高い傾向があります。割引率が同じ場合はレート(時間あたりの金額)が低いものが優先されます。

EC2、Fargate、Lambda に順次適用されていき、コミット金額を超えた分はオンデマンド料金として請求されます。

前提

  • 本記事で書かれている料金は2020年4月時点の料金をもとに計算しやすいように変更しているため、正規の料金ではありません
  • 本記事で触れる Savings Plans の料金は東京リージョン、1年全額前払い、共有テナンシーとしています
  • $ はアメリカ合衆国ドル(USD)を指しています
  • Savings Plans における割引の考え方や種類(EC2 Instance Savings Plans、Compute Savings Plans)など前提知識については触れません。AWS Webinar か AWS コスト本をご参考ください。

aws.amazon.com

料金例

次のような料金例とします。割引率は (1 - SP料金レート/オンデマンド) × 100 で算出しています。Lambda リクエストは Savings Plans の割引をうけないため、割引率は 0% です。

オンデマンド Compute Savings Plans 料金レート 割引率 EC2 Instance Savings Plans 料金レート 割引率
m5.4xlarge Linux $1.00/h $0.75/h 25% $0.65/h 35%
Fargate vCPU $0.05/h $0.04/h 20% - -
Fargate Memory $0.005/h $0.004/h 20% - -
m5a.24xlarge Windows $10.0/h $8.5/h 15% $8.0/h 20%
Lambda 実行時間 $0.0000167 $0.0000142 15% - -
Lambda リクエスト $0.0000002 $0.0000002 0% - -

1時間の間に次のような使い方をするとします。Lambda は毎時の利用量は一定と仮定しています。現実は Lambda の利用量が毎時異なると思うので、使用状況レポートから Lambda の毎時間あたりの利用量を確認しておくとよいでしょう。

  • Linux m5.4xlarge × 4台
  • Windows m5a.24xlarge × 1台
  • Fargate 400 vCPU、1,600 GB
  • 512MB の AWS Lambda 関数が月間100万リクエストの実行。1回の実行につき3秒間

シナリオ1 〜Savings Plans をすべて適用する〜

上の AWS リソースをすべて SP のコミットメントに含めるにはどのぐらい必要かを計算します。

  • Linux m5.4xlarge:$0.75 × 4 = $3
  • Fargate vCPU:$0.04 × 400 = $16
  • Fargate Memory:$0.004 × 1,600 = $6.4
  • Windows m5a.24xlarge:$8.5 × 1 = $8.5
  • Lambda 実行時間:$21.3
  • Lambda リクエスト:$0.2

Lambda の料金は計算表にしたがって、次のように計算しています。Lambda の無料利用枠は考慮していません。

合計コンピューティング (秒) = 1,000,000 × 3秒 = 3,000,000 秒
合計コンピューティング (GB-秒) = 3,000,000 × 512 MB ÷ 1024 = 1,500,000 GB-秒
実行時間に対する料金:1,500,000 × $0.0000142 = $21.3
リクエストに対する料金:1,500,000 × $0.0000002 = $0.2

合計で $54.7/h の Compute SP を購入すればよいことがわかります。オンデマンド料金レートだと $67.25/h*1かかるので、1時間につき $11.85 お得になります。月間 $8,532 なのでかなりの節約になります。

シナリオ2 〜Savings Plans を一部適用する〜

一部だけ SP をコミットメントした場合のケースです。Compute SP を $2.0/h コミットしたとします。適用ルールにつき、最も割引率が高い Linux m5.4xlarge(割引率 25%)から適用されます。しかし、m5.4xlarge × 4の Compute SP レートの合計は $3/h なのですべて賄うことができません。

そこで、最初に実行中インスタンスの Compute SP レートとコミット金額の割合を計算します。

$2.0 ÷ $3 × 100 ≒ 66.67%

次に m5.4xlarge × 4 の内、Compute SP が適用される台数を求めます。

4台 × 66.67% ≒ 2.67台

つまり、2.67 台までは Compute SP のレートが適用され、残り 1.33 台はオンデマンド料金のレートとして請求されます。SP が適用されない、残りの EC2、Fargate、Lambda も合わせると $64.38/h の オンデマンド料金が発生します。

シナリオ3 〜複数 AWS リソースに Savings Plans を適用する〜

Compute SP $46.7/h のコミットメントを購入したとします。適用ルールにつき、最も割引率が高い Linux m5.4xlarge(割引率 25%)から適用されます。

$46.7 - $3 = $43.7

コミットメントが残っているため、次に割引率が高い Fargate(割引率 20%)が適用されます。vCPU と Memory の割引率が同じですが、レートが低い Fargate Memory から適用されます。

$43.7 - $6.4 = $37.3

コミットメントが残っているため、次に割引率が高い Fargate vCPU(割引率 20%)が適用されます。

$37.3 - $16 = $21.3

コミットメントが残っているため、次に割引率が高い Windows と Lambda 実行時間(割引率 15%)が適用されますが、レートが低い Lambda 実行時間が優先されます。

$21.3 - $21.3 = $0

ちょうどコミットメントが満たされたため、残りの Windows(m5.24xlarge × 1)と Lambda リクエストはオンデマンド料金として $10.2/h が発生します。

シナリオ4 〜リザーブドインスタンスと Savings Plans が混在したパターン〜

RI と SP が混在したパターンを考えます。Linux、m5.4xlarge のリージョン RI を 2つ、Compute SP $23.9/h のコミットメントを購入したとします。適用ルールにつき、先に RI が適用されます。条件が一致する Linux m5.4xlarge × 2が RI に適用されます。

RI がすべて適用されたら SP の適用について見ていきます。割引率が最も高い Linux m5.4xlarge から適用されます。RI が適用されなかった残りの2台分が適用されます。

$23.9 - $0.75 × 2 = $22.4

コミットメントが残っているため、次に割引率が高い Fargate(割引率 20%)が適用されます。vCPU と Memory の割引率が同じですが、レートが低い Fargate Memory から適用されます。

$22.4 - $6.4 = $16

コミットメントが残っているため、次に割引率が高い Fargate vCPU(割引率 20%)が適用されます。

$16 - $16 = $0

ちょうどコミットメントが満たされたため、残りの Windows(m5.24xlarge × 1)と Lambda はオンデマンド料金として $35.25/h として発生します。

シナリオ5 〜複数の Savings Plans が混在したパターン〜

EC2 Instance SP、Compute SP が混在したパターンを考えます。インスタンスファミリー M5、ap-northeast-1(東京リージョン)の EC2 Instance SP $2.6/h、Compute SP $22.4/h のコミットメントを購入したとします。適用ルールにつき、EC2 Instance SP が優先されます。条件にマッチする Linux m5.4xlarge が適用されます。

$2.6 - $0.65 × 4 = $0

Linux m5.4xlarge 4台すべて適用され、EC2 Instance SP もすべて満たされました。次に Compute SP の適用について見ていきます。割引率が高い Fargate(割引率 20%)が適用されます。vCPU と Memory の割引率が同じですが、レートが低い Fargate Memory から適用されます。

$22.4 - $6.4 = $16

コミットメントが残っているため、次に割引率が高い Fargate vCPU(割引率 20%)が適用されます。

$16 - $16 = $0

ちょうどコミットメントが満たされたため、残りの Windows(m5.24xlarge × 1)と Lambda はオンデマンド料金として $35.25/h として発生します。

まとめ

本記事では Savings Plans の適用ルールについてまとめ、具体的な適用例について AWS ドキュメントをベースに紹介しました。地道に計算すればどのぐらいコミットすればいいのかがわかるかと思います。しかし、現実は膨大なEC2インスタンスや Lambda の利用量が時間変化するため求めることが困難です。

素直に Savings Plans の推奨事項をもとにコミットメント額を決めたほうがよいです。先日のアナウンスでリンクされたメンバー AWS アカウントでも推奨事項が見れるようになりましたので積極的に活用していきたいところです。

AWS Cost Explorer が、(リンクされた) メンバーアカウントに対して Savings Plans の推奨を開始

参考文献

*1:上の計算式でオンデマンド料金にすることで算出できます