スポットインスタンスを安定して利用するための取り組み

この記事は、[AWS Advent Calendar 2014](http://qiita.com/advent-calendar/2014/aws) の12日目の記事です。

AWSを利用したゲームの運用を行い約1年半、この記事ではAWSのスポットインスタンスを利用した取り組みについて簡単に紹介したいと思います。

なお、こちらの記事は、2014年7月17日（木）～18日（金）に行われた[AWS Summit 2014 Tokyo](http://www.awssummittokyo.com/)の「Tech Deep Dive By Customers」トラックで発表させて頂いた「[AutoScale×ゲーム ～運用効率化への取り組み～](http://aws.amazon.com/jp/summit2014-report/details/)」のスポットインスタンスの利用についての簡易版となります。

# はじめに

みなさんスポットインスタンス利用していますか？
今年に入ってAWSも大幅な値下げが続き、よりサーバ構築や検証を簡単にできるようになったのではないでしょうか。その中でもスポットインスタンスは、破格の価格で利用することが出来「バッヂ処理」や「検証」のため一時的に利用するには素晴らしいサービスだと個人的にすごく感じています。

# スポットインスタンスとは

[スポットインスタンス](http://aws.amazon.com/jp/ec2/purchasing-options/spot-instances/)とは、AWSで余剰のインスタンスを入札制で大幅に安い価格で利用できる仕組みです。需要と供給のバランスで価格が決定するため、時には通常のオンデマンドインスタンスで利用するときより高い価格になる場合もあります。


基本的には、「この料金まで支払うことが出来る」というサーバの入札価格を決め、時系列に変動するサーバ価格が入札価格より低い場合に、利用することが出来ます。
しかし、スポットインスタンスの需要が増えるとサーバの価格が上がり、入札価格がサーバ価格に達しなくなると、利用中のサーバがストップされてしまいます。

![[スポット]サーバが落ちる.png](https://qiita-image-store.s3.amazonaws.com/0/17346/15cd4f03-da6a-84fb-4fc0-8e65d2db98ec.png)![[スポット]サーバが起動しない.png](https://qiita-image-store.s3.amazonaws.com/0/17346/81e41505-007e-4898-abed-9924990dca8a.png)


そのためユースケースとしては、「オプションのタスク」や「遅延可能なタスク」などバッヂ処理やビックデータ解析、テストなどでの利用が推奨されています。（[Amazon EC2 スポットインスタンスについて](http://aws.amazon.com/jp/ec2/purchasing-options/spot-instances/)）

そのようなスポットインスタンスを、ゲームの本番運用において安定稼働させ、サーバ費用を安く済ませている取り組みについて、いくつか紹介します。

# スポットインスタンスを安定利用するために

## 1: オートスケールと組み合わせた利用
AWSのオートスケールでは、サーバ起動台数の設定を行うことが出来、設定された台数が起動していない場合、指定したAMIから自動でサーバを起動しELBに追加する仕組みが提供されています。ここにスポットインスタンスを適用することで、仮にサーバの価格が入札価格を上回ってサーバが利用できなくなっても、オートスケールの機能で自動で元の台数までサーバを起動させることが出来ます。

参考
* [【AWS】AutoScaleの設定について](http://megadreams14.com/?p=418)
* [【AWS】AutoScalingを使う際の注意点についてまとめてみました](http://dev.classmethod.jp/cloud/aws/autoscaling_considerations-for-system-configuration/)

ただし、スポットインスタンスの入札価格がサーバ価格を下回っている場合には、「入札待ち」となりサーバ価格が下がるまではインスタンスを起動することは出来ません。

![スポットインスタンスとオートスケール.png](https://qiita-image-store.s3.amazonaws.com/0/17346/9754cdc9-f504-1964-f62b-d1dfc402ef9a.png)


## 2: 複数インスタンス、複数入札価格の設定
そこで、利用するのがインスタンスタイプや入札価格を変えたスポットインスタンスを利用することです。
スポットインスタンスは、インスタンスタイプ毎またはAvailabilityZone毎に価格が変動しているため、「aゾーンのr3.2xlargeインスタンスの価格は高いけどcゾーンの価格は安かった」とか、「c3.4xlargeの方がm3.xlargeより安かった」といったことが普通に発生します。

![スクリーンショット 2014-12-12 1.53.58.png](https://qiita-image-store.s3.amazonaws.com/0/17346/7b3c0b0f-d5af-7cf7-9fcc-a6d9e11fe1b7.png)


これをオートスケールの設定に組み込むことで、入札価格がサーバ価格より低くて「入札待ち」の状態となっているサーバがあったとしても、立ち上げるインスタンスの設定を変更することで「入札待ち」が「入札キャンセル」となり、新たな設定で再度「入札」を行ってくれます。

そのため、入札待ちが発生したら立ち上げるインスタンスの設定を変更することで、「サーバが立ち上がらない」といった問題を解決することが出来ます。


## 3: 価格変動を検知し、スポット価格を切り替える
「オートスケールの利用」と「複数インスタンス、入札価格の設定」を行うことで、サーバが立ち上がらない問題は解消することが出来ますが、「誰がその設定を切り替えるの！？」という疑問が生じます。

サーバ価格が上がり、スポットインスタンスが全て落ち、更に価格が下がらないからサーバが立ち上がらず、結果サーバ負荷が上がってアラートメール受け取りようやく切り替える、といった運用ではサービスを安定して稼働させることは出来ません。そこで、取り組んでいるのが価格変動を検知して「今最適なインスタンスタイプ・価格はどれなのかを判定し、オートスケールの設定変更を行う」を自動で行うことです。

スポットインスタンスの価格情報は、CloudWatchのAPIを利用することで取得可能でありオートスケールの設定変更もAPIを叩くことで可能なため、後は「トリガーの設定」と「どのスポットインスタンスの設定を利用するか」を決定するロジックを書けば良いだけです。

![zabbixとjenkins.png](https://qiita-image-store.s3.amazonaws.com/0/17346/c887f022-0fe3-503e-d8ce-1a53a54e4963.png)

現在は、ZABBIXで価格情報を保持及びアラートをセットし、そしてJenkinsでオートスケールの設定変更が出来る仕組みを用意することで、自動で切り替えられるような処理を記載することで実現可能となっております。

# とは言えスポットだけの運用はまだまだリスクはある

スポットインスタンスは通常のインスタンスと比べると破格の価格で利用することが可能です。ですが、どれだけ上記のような設定をしていても全てをスポットインスタンスで運用すると全台落ちるリスクもあるため、本番運用を行うにはオンデマンドインスタンスとの併用が基本となると思います。
なお、実際にスポットとオンデマンドを併用して利用してみた結果、全てオンデマンドインスタンスで運用した時より「3~4割のコスト削減」を達成することが出来ました。

![オンデマンドとスポットの比率.png](https://qiita-image-store.s3.amazonaws.com/0/17346/660864d0-c74e-bc6f-c301-00247b3b2efc.png)

これにリザーブドインスタンスを組み合わせると更にコストダウンがはかれますね！

# まとめ
スポットインスタンスは、本来は一時的な利用が基本かと思いますが、今回の取り組みのように￼￼様々なツールを組み合わせることで、「サーバコスト下げて！でも安定稼働必須ね」といった現場に求められているニーズにあったソリューションを構築することが可能となりました。
とはいえ、まだまだ改善しなければいけない点も多く新しいサービスも続々とリリースされているため、様々なサービスをまずは触ってみることで「どう現場に活かせるか」引き出しを増やしていくことが大切だと感じ、今後もより良くしていくために取り組んでいきたいです。


# 余談
余談ですが、私達がスポットインスタンスを本格的に利用し始めたのは昨年の10月頃からですが、昨年に比べてかなり利用者が増えたなという印象があります。昨年はスポットインスタンスの価格変動がほとんどなく上記のような取り組みをしなくても安定して稼働させることが出来ていたのですが、今年に入って価格変動が激しくなり、サーバ価格を抑える取り組みのひとつとして、スポットインスタンスを安定して利用して行くにはどうしたらよいか悩んだ末にたどり着いたのが上記のような仕組みとなります。
スポットインスタンスを利用するひとつの方法として皆様の参考になればと思っております。

----

下記資料もご参考にして頂ければ幸いです。

* 発表資料:「AutoScale×ゲーム ~運用効率化への取り組み~」
  * [前半資料](http://www.slideshare.net/megadreams14/aws-summit-tokyo-2014-tc09)
  * [後半資料](http://www.slideshare.net/TakashiHonda0628/aws-summit-2014tokyo)
* 日経ＳＹＳＴＥＭＳ2014年9月号掲載
  * 特集２　ゲーム会社の現場に学ぶ　基盤運用力、ログ分析力
  * http://ec.nikkeibp.co.jp/item/backno/OS0257.html