『あんさんぶるスターズ!!』における、AWSコストの最適化手法について
この記事は「Cacalia Studio アドベントカレンダー 2021 エンジニア版」の10日目の記事です。
こんにちは、HappyElements 株式会社でインフラを担当しております、K.Hです。
今回は、「あんさんぶるスターズ!!Music」における、AWSコストの最適化手法についてお話したいと思います。
今回は以下の3つのポイントについてお話いたします。
1.技術構成について
2.EC2費用の最適化について
3.ネットワーク費用の最適化について
技術構成について
構成図
EC2費用の最適化について
あんさんぶるスターズ!!Musicでは、EC2起動タイプのECS上にシステムが構築されています。
EC2の費用を抑える定番の方法として、以下の2つがあげられます。
● リザーブドインスタンスの活用
● スポットインスタンスの活用
あんさんぶるスターズ!!では、どちらも積極的に活用しています。
スポットインスタンス/リザーブドインスタンスについて
これらはWebで検索すればたくさん情報がヒットしますが、あらためて簡単にまとめておきたいと思います。
リザーブドインスタンス
リザーブドインスタンスには、大まかに以下の3種類が存在しています。
購入方法/期間によって割引率は大きく変化しますが、スタンダードRIを利用し、1年分を購入した場合は平均して40%程度の割引率になります。
同RIにて3年分を購入した場合は平均60%程度まで割引されます。
スポットインスタンス
AWSの利用されていないキャパシティを利用することで、大幅な割引を受けることが出来ます。
価格は日々緩やかに変動していますが、最大で90%程度の割引率になります。
利用されていないキャパシティとは
あくまでも余剰キャパシティを利用しているだけであり、デグレードされたEC2インスタンスが起動するわけではありません。
同じインスタンスタイプであれば、オンデマンドとスポットでパフォーマンスに差異はありません。
リザーブドインスタンス/スポットインスタンスの活用
使い分けについて
リザーブドインスタンス、スポットインスタンスを積極的に活用していくにあたって、それぞれの使い分けを考える必要があります。
あんさんぶるスターズ!!Musicでは、以下のような方針でこれを使い分けています。
● 定常的に起動するものはリザーブドインスタンスで賄う。
● リザーブドインスタンスで賄えない部分はすべてスポットインスタンスで
賄う。
ステートフルなサーバー等例外はありますが、HTTPサーバーのようなステートレスなサービスであればこの考え方で原則安全に運用が可能です。
リザーブドインスタンスの購入数の決め方
ゲームのトラフィック増加は、事前に考慮しやすいものがいくつかあります。
● イベント期間の開始直後と終了間際
● ログインボーナスのリセット時間
● お昼休みや終業後など、ユーザーさんの自由時間
● CMや広告出稿等の露出が増えるタイミング
これらの一時的なスパイクを除くと「定常的な負荷」が見えてきます。
この定常的な負荷を十分に捌け、更に安全係数を掛けたインスタンス数をリザーブドインスタンスとして購入し常時起動します。
※安全係数 -> 上記以外の突発的なスパイクやオートスケールまでのタイムラグに備え、サーバーのCPU使用率は定常時はN%を最大とする等。
リザーブドインスタンスを購入する際のポイント
リザーブドインスタンスはリージョン毎に購入する必要があります。
東京リージョンでEC2を利用したいのに、大阪リージョンでこれを購入してしまうと利用出来ません。
また、購入したリザーブドインスタンスは払い戻し出来ません。
ベータですが、リザーブドインスタンスのマーケットプレイスに出品することでRIの再販は可能です。
スポットインスタンスを利用する際のポイント
スポットインスタンスはリザーブドインスタンスと違い、先に購入数を決める必要はありません。
必要な際に必要なだけリクエストすることで、利用した分だけの費用とすることができます。
ただし、スポットインスタンスにも、「インスタンスの中断リスク」というトレードオフがあります。
スポットインスタンスの中断リスク
スポットインスタンスとして利用中のインスタンスタイプの需要が高まった際、AWSによってインスタンスが中断される事があります。
1度に中断される数に制限もありませんので、理論上は全数が一気に中断されることもありえます。
Amazon ECSとスポットインスタンスを組み合わせる際のポイント
Amazon ECSでもスポットインスタンスを利用することはできますがスポットインスタンスを利用する際には以下のポイントを抑えておく事が必要になります。
● スポットインスタンスの中断に備える。
● スポットインスタンスの中断リスクを下げる。
スポットインスタンスの中断に備える
なにはともあれ、スポットインスタンスの中断リスクをゼロにはできませんので、中断が発生した場合に備える必要があります。
中断発生時に行うべき事として、以下のようなものがあります。
● 新規タスクの配置を停止する。
● 既存タスクのドレイニング & LB切り離し & 停止 & ログ退避など。
● 別コンテナインスタンスでのサービスタスク実行。
これらについて、EC2インスタンスのユーザーデータなどで、
ECS_ENABLED_SPOT_INSTANCE_DRAINING=true
を /etc/ecs/ecs.config に書き込んでおくことで、ECS Agentが自動でこれらの対応を行ってくれます。
設定例
スポットインスタンスの中断リスクを下げる
中断に備えているとはいえ、可能であればスポットインスタンスが中断されて欲しくはありません。
Autoscaling Groupを利用する際、インスタンスタイプを複数指定することができます。
この際、インスタンス起動時に一番キャパシティに余裕があるタイプをAutoscalingGroupに起動してもらうことで、大幅に状況が改善することがあります。
ネットワーク費用の最適化について
通せる通信はすべてCloudFrontを通すとコスト減になる事があります。
単純なアセット配信はもちろん、あんさんぶるスターズ!!Music ではAPI通信もCloudFrontを通しています。
CloudFrontを通す事で、以下のような料金プランを利用することができるようになり、結果的にコストを最適化することができることがあります。
● CloudFront Reserved Capacity
12か月間以上、1か月あたり最小10TBのデータ転送量の利用を約束する
ことで、1GBあたりのネットワーク費用のレートが下がります。
割引率等はケースバイケースですので、10TB/月以上の継続的な利用が
見込める場合、一度話を聞いてみると良いかもしれません。
● CloudFront Security Savings Bundle
上記の最小データ転送量に満たない場合、CloudFront Security Savings Bundleというものもあります。
割引率は最大で約30%程度になります。
まとめ
● EC2起動タイプのECSにおいても、リザーブドインスタンス/スポットイン
スタンスを積極的に活用できます。
◦ リザーブドインスタンスは購入方法や期間、リージョンが意図した
ものかを確認しましょう。
◦ スポットインスタンスは中断に備え、かつ中断リスクを下げるために
複数のインスタンスタイプを利用しましょう。
● 通せる通信はCloudFrontを通すことで、お得な料金プランを最大限利用
できます。
◦ 10TB/月の利用が12ヶ月継続されそうか?というのが1つの指標と
なります。
--
Happy Elements カカリアスタジオでは
いっしょに「熱狂的に愛されるコンテンツ」をつくっていただけるメンバーを大募集中です!
もし弊社にご興味持っていただけましたら、是非一度
下記採用サイトをご覧ください!