Amazon EC2スポットインスタンスの価格高騰時の振る舞いで「停止」が選択できるようになりました

2017.09.20

ども、大瀧です。
昨日、EC2スポットインスタンスのアップデートがあり、中断(価格高騰)時の振る舞いとしてインスタンスの停止が追加されました。試してみた様子をレポートします。

スポットインスタンスの中断とは

スポットインスタンスは、インスタンスの実行費用を入札で決める価格体系です。実行費用はインスタンスタイプ、アベイラビリティゾーン毎に需要によって市場価格として変動します。入札価格は以下2種類から選択することができ、今回のアップデートは「最高入札価格」を選択する場合に適用されます。

  • 自動入札 : その時点の市場価格で入札する。価格が高騰するとオンデマンド(通常プラン)の価格を超えることもある
  • 最高入札価格 : 市場価格が最高入札価格を上回らないときに市場価格で入札する。上回る場合はスポットインスタンスが中断される

従来、スポットインスタンスの中断はインスタンスの終了(Terminate)という扱いになり、アプリケーションで扱うデータやログなどの待避を検討する必要がありました。インスタンスの停止を選択することによって、市場価格が落ち着いたときにインスタンスが再度起動し、アプリーケーションが復旧、データも維持できるようになりました。

適用要件

中断時の振る舞いを「停止」にするための要件を示します。

  1. スポットリクエストタイプで永続リクエスト(スポットフリートの場合は維持)を選択
  2. Interruption behaviorで「Stop」を選択

以下は、スポットフリートで設定した様子です。

spotstop01

spotstop02

振る舞いの様子

スポットリクエストが有効(active)になり市場価格が安かったため、まずはインスタンスが作成され起動してきました。

spotstop03

Management Consoleのスポットリクエストの履歴は以下のようになります。(スクリーンショットは、一部のタイムスタンプが順不同です。ご了承ください)

spotstop08

ほどなくして、市場価格が高騰しスポットの中断が発生、設定通りインスタンスは停止しました。

spotstop04

Management Consoleのスポットリクエストの履歴は以下のようになります。停止の場合でもStatus列にはterminatedと表示されることに注意してください。

spotstop09

市場価格が落ち着くと、再度launchedと表示されインスタンスが起動します。自動で起動されるのと、インスタンスIDが停止時と同じというのがポイントですね。

spotstop10

例えば以下のcronジョブを仕込んでおくと、起動したインスタンスでStop時の様子が確認できます。

* * * * * curl -f http://169.254.169.254/latest/meta-data/spot/instance-action >> /home/ec2-user/instance-action.log 2> /dev/null

instance-action.log

{"action":"stop","time":"2017-09-20T00:30:00Z"}{"action":"stop","time":"2017-09-20T00:30:00Z"}{"action":"stop","time":"2017-09-20T00:30:00Z"}

従来、インスタンスが終了する場合はEBSボリュームが残るよう設定するかS3などに待避させ、他のインスタンスから参照する必要がありました。

手動での開始/停止は不可

ちなみに、Management Consoleから停止時のスポットインスタンスを起動しようとすると、以下のエラーになり起動できませんでした。

spotstop07

逆に実行中のインスタンスの停止も項目がグレー表示で実行できません。あくまで価格に応じた停止、起動が実行されるわけですね。また、インスタンス起動のタイミングは市場価格が落ち着いてしばらく遅れてから動作した印象です。

まとめ

EC2スポットインスタンスの中断時に停止させる様子をご紹介しました。スポットフリートによる複数インスタンスタイプ、アベイラビリティゾーンを組み合わせるスポットフリート構成では全インスタンス中断が発生するリスクはかなり小さいので、実際の利用で中断についてそこまでこだわるケースは多くないと思います。安心してスポットインスタンスが使える要因が一つ増えた、と感じていただければ良いと思います。

参考URL