スポットインスタンスについて

f:id:kikuchi_et_al:20210404000752p:plain

参考資料

https://pages.awscloud.com/rs/112-TZM-766/images/B1-01.pdf

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

インスタンスの買い方の一つ。最大で90%まで割引できる。 EC2の空きキャパシティを活用した買い方なため、キャパシティが無くなるとインスタンスは中断される。

補足:中断されるとどうなるのか?

中断動作 Amazon EC2 が スポットインスタンス を中断させるときに、次のいずれかを実行するように指定できます。

・ スポットインスタンス を停止させる

・ スポットインスタンス を休止させる

・ スポットインスタンス を終了させる

デフォルトでは、スポットインスタンス は中断されると終了されます。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/spot-interruptions.html#interruption-behavior

ユースケース

アプリケーションの中断に強く、ハイパースケールのワークロードに適してる。

スポットインスタンスの基本

スポットインスタンスは空きキャパシティがあれば起動する。

この空きキャパシティのことを スポットプール と呼ぶ。

スポットインスタンスの4原則

1.ステートレス

スポットインスタンスは中断されることがあるので、インスタンス内に情報を持たせない。

2. 再開可能なワークロード

処理が中断されても問題ないような作りにする。

3.疎結合

疎結合なシステムにすることで中断されても影響を小さくする事が出来る。

4. 分散

複数アベイラビリティゾーンと複数インスタンスタイプを活用することで安く購入できる可能性が上がる。

スポットインスタンスアンチパターン

  • 高可用性を求められるワークロード
    • 例:データベース等
  • チェックポイントを設けにくいステートフルなワークロード
  • アンチパターンな理由:どちらもスポットインスタンスが中断された時のリスクが大きいため

スポットインスタンスの価格

スポットインスタンスは需要と救急に基づいて価格が変動し、その時点のスポットインスタンスの値段のことをスポット価格と呼ぶ。

価格変動の様子を把握すにはEC2のマネージドコンソールから確認できる。

図から分かる通り、同じインスタンスタイプであってもAZによって価格が異なる。

f:id:kikuchi_et_al:20210403235436p:plain


f:id:kikuchi_et_al:20210403235459p:plain

補足:スポットインスタンスアドバイザー

リージョン毎、インスタンスタイプ毎に中断頻度を確認できるツール。

使用するにはワークロードに使うvCPCとメモリを洗い出しておく必要がある。

スポットインスタンスアドバイザーは中断する可能性が最も少ないプールを判断して、オンデマンド料金を削減できます。 スポットインスタンスを選択する前に、お客様はアプリケーションの中断をどの程度許容できるか、およびコスト削減の目標を比較検討する必要があります。 中断の頻度が低いほど、スポットインスタンスを利用できる時間は長くなります。

https://aws.amazon.com/jp/ec2/spot/instance-advisor/

入札不要モデル

スポットインスタンスには上限価格というものを設定できる。

(以前までは上限価格のことを入札価格と呼んでいた。)

上限価格のデフォルト値はオンデマンド料金になっている。

上限価格は任意の値に設定できるが、デフォルトであるオンデマンドの料金に設定しておくことをAWSは推奨している

  • 理由
    • 上限価格を手動で制御すると人手の工数が高かくなるから。
    • 複数のインスタンスタイプを混ぜて購入することが多いため、インスタンスタイプ毎に上限価格を設定するのは負担。
    • 上限価格をオンデマンドの料金にしておけば、オンデマンドインスタンスを使う時より高い金額を請求されなくて済むので安心して使うことが出来る。

補足:上限価格にオンデマンド価格の10倍の値段を設定したらスポットインスタンスが起動しやすくなるのか?

ならない。スポットインスタンスは高い値段で購入しようとしても空きキャパシティが無いと起動することは出来ない。

スポットインスタンスが中断する理由

  • EC2の空きキャパシティの不足
    • オンデマンドインスタの需要増加等
  • スポット価格が変動し、設定していた上限価格を上回った

中断通知

スポットインスタンスが中断する中断する2分前までに中断通知がくる。

この2分間では以下のようなことを行う必要がある。

  • 計算途中の処理等をS3やEFSに退避する。
  • 新規処理の受付を停止する。
  • コンテナであれば新規タスクを立ち上げないようにする。

中断通知を受信する2つの方法

インスタンスメタデータから取得する方法

下記で取得可能。通常時は404、中断時にはステータスコードが200になり、中断予定時刻が返却される。

http://169.254.169.254/latest/meta-data/spot/instance-action

AWSとしてはこのメタデータから中断通知を取得する場合、5秒毎に監視を行うことを推奨している。

EventBridgeから取得する方法

イベントパターンのサービス名をEC2、インスタンスタイプを「EC2 Spot Instance Interruption Warning」にする。

通知先にはLambdaもしくはSNSを設定する。

Lambdaに通知させた場合はどのインスタンスが中断するかをまず把握する必要がある。

中断通知のテスト

任意的に中断する事はできないが、中断通知をテストすることはできる。

方法①:スポットフリートを使う

作成時に「ターゲット容量を維持する」を選択し「中断動作」は「終了」にする。

ターゲット容量を最初に3に設定し、その後2に設定する事で任意的に中断通知を出す事が出来る。

方法②:EC2 Metadata Mockを使う方法

GitHubに公開されているツール。

メタデータサービスのシミュレーションを行なったり、メンテナンスイベント等を擬似的にテスト出来る。

amazon-ec2-metadata-mock

EC2 Metadata Mockだと擬似的にメタデータの出力を変更しているだけなので、EventBridgeを使った通知テストはできない。

スポットインスタンスを起動する4つの方法

スポットインスタンス(単体)

シンプルに一台だけ起動したい時にオススメ

スポットフリート

マネジメントコンソールを使ってスポットインスタンスをまとめて起動・管理するときにオススメ

EC2 Auto Scaling ※AWS推奨

Auto Scalingの各種機能を使ってスポットインスタンスを管理したい場合にオススメ

また、EC2 Auto Scalingの新機能としてミックスインスタンスグループというものがある。

ミックスインスタンスグループを使うと、オンデマンドとスポットを混ぜるだけでなく複数のインスタンスタイプもミックスすることが出来る。

EC2フリート

同期処理や最小起動台数保証などコントロールできる。使用するにはCLI/APIで行う必要がある。

補足:capaciy-optimized

capaciy-optimizedを選択することで中断されにくいAZでスポットインスタンスを起動してくれる。

注意点としては、スポットフリートもしくはEC2フリートでcapaciy-optimizedを有効にした場合、インスタンス群が1箇所のAZで起動する可能性がある。

しかし、EC2 Auto Scalingの場合、複数のAZで起動するようにしていればcapaciy-optimizedを有効にしていても各AZでスポットインスタンスが起動するようになっている。