Tomo's IT Blog

技術的な調査メモ

AWSのスポットインスタンスを作成する

目的

AWSの勉強中です。今日はスポットインスタンスに関していろいろと調べてみました。

急ぎでちょっとした検証でサーバ環境がほしいと思った場合、EC2のスポットインスタンスを利用すると安いし便利そうですね。そこで、今回はEC2ダッシュボードのスポットリクエストからインスタンスを作成してみようと思います。

スポットインスタンスそのものの説明は以下のドキュメントを参照してください。
docs.aws.amazon.com

スポットインスタンスの作成

ダッシュボードからインスタンス->スポットリクエストを選択し、以下のような"スポットインスタンスのリクエスト"ボタンから作成が可能です。
f:id:tmnj:20161125094750p:plain

早速押してみます。スポットインスタンスの作成ウィザード画面が表示されます。最初の画面ではリクエストタイプの選択をするようです。
リクエストタイプは3つの選択肢があります。これはそれぞれどのように異なるのでしょうか?

f:id:tmnj:20161125095017p:plain

リクエストタイプの違い

ということで、該当するドキュメントを探してみました。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-requests.html

"リクエスト"と"リクエストの維持"の違いは以下の図が解りやすいです。

f:id:tmnj:20161125095403p:plain

どちらのリクエストタイプも入札価格が現在のスポット価格を下回っている場合は待機します。待機状態は自分でキャンセルするか、入札価格が上回るまで続きます。ワンタイムの"リクエスト"はスポット料金の変動やユーザによる操作でインスタンスが終了するとリクエストは破棄されて終わりです。"リクエストの維持"を選択していると、インスタンス終了後にリクエストは再オープン状態で待機するという動きになります。

これに対してリクエストタイプの"継続期間の予約"の場合、スポット料金が変動して入札価格を上回っても指定した時間は動作し続けます。1~6時間で指定できるようです。あらかじめ稼働時間が決まっていてその時間は勝手に止まらないようにしたい時に選択します。
ただし、継続期間を指定したスポットインスタンスは通常のスポットインスタンスより料金は高めになるようです。

スポットインスタンス:ワンタイムと継続の料金比較

料金 - Amazon EC2 スポットインスタンス - Amazon EC2 | AWS

ある日のm4.largeの東京リージョンのLinux料金比較です(需要と供給により変動します。)

タイプ スポットインスタンス 継続期間6h オンデマンド
m4.large $0.0223 /1 時間 $0.128 /1 時間 $0.174 /1 時間

オンデマンドよりは安いですが、継続指定する場合としない場合で、約5.7倍金額が変わるようです。

ターゲット容量、AMI、インスタンスタイプ

f:id:tmnj:20161125111045p:plain

これは適当に入力しますが配分戦略を試すために2つにしてみます。

配分戦略

f:id:tmnj:20161125105113p:plain

配分戦略とは。
これを理解するにはまず、スポットフリートという概念を理解する必要があります。

スポットフリートの詳細な説明は以下のURLに記載があります。
スポットフリートの仕組み - Amazon Elastic Compute Cloud

要は、必要なインスタンス数を指定しておくと必要な数のスポットインスタンスを維持しようと自動で試みてくれる仕組みということでしょうか。
配分戦略とは、このスポットフリートの配分戦略ということになり以下の2つがあります。

配分戦略を選ぶ場合は、インスタンス1つ以上の場合に意味のあるもことになるのかなと思います。
例えばインスタンス数を2にしてlowestPriceを選択すると一番安いアベイラビリティゾーンにインスタンス2つ作成され、diversifiedを選択するとそれぞれ別のアベイラビリティゾーンにインスタンスが作成されるということでしょう。

今回は、diversifiedを選択してみます。その他はデフォルトのまま次へ。

f:id:tmnj:20161125111316p:plain

ステップ2の設定は適当に入力して作成を実行します。

スポットインスタンスリクエストの確認

f:id:tmnj:20161125112025p:plain

リクエストタイプがfleetで作成されました。

インスタンスを見ると、配分戦略をdiversifiedにしているためそれぞれ別のアベイラビリティゾーンに作成されていることが確認できます。
f:id:tmnj:20161125112154p:plain

スポットフリートの重み付け

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-fleet.html#spot-instance-weighting

スポットフリートでは、動作させたいアプリケーションに必要なリソースをより効率的にインスタンス化するための仕組みが用意されているようです。
非常にシンプル化していうと、例えばアプリケーションを動作させるのに必要なvCPU数が32(=ターゲット容量)だとします。
これを満たすためのインスタンスタイプの組合せは様々ですが例えば、以下の2つを考えます。

  • r3.2xlarge(vCPU 8)
  • r3.4xlarge(vCPU 16)

ターゲット容量32を満たすには以下のいづれかになります。

スポットフリート・リクエストに上記のインスタンスの重み付けを記述しておくと、安いインスタンスタイプが自動で選択されるということになります。
なおこのようなリクエストはコンソールからはできずに、jsonに条件を記述してcliで実行する必要があるようです。

スポットインスタンス、なかなか奥が深いですね!

スポットインスタンスの入札ステータスの確認

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-bid-status.html

発行したスポットインスタンスリクエストがどのような状況かを確認できます。
確認するにはEC2ダッシュボードのスポットリクエストから該当のリクエストIDを選択してstatusをチェックします。

f:id:tmnj:20161125120740p:plain

例えばリクエストがOpen状態で待機している場合や、スポットインスタンスが終了してしまったときにどういった理由で待機・終了したのか理由を知ることができます。

スポットインスタンスの起動停止

スポットインスタンスは、インスタンスの再起動・停止のみ実施できます。
なお、

スポットインスタンスを OS レベルでシャットダウンすると、スポットインスタンスが終了されます。この動作を変更することはできません。

とのことなので、うっかりshutdownコマンド打たないように気をつけましょう。
rebootはOKでした。

スポットインスタンスのベストプラクティス

以下のBlogが参考になりそうなので、暇を見つけて読み込もうと思います。
Focusing on Spot Instances – Let’s Talk About Best Practices | AWS Blog