- Azure や AWS には大幅なディスカウントのある Spot VM インスタンスがある
- Azure の Spot VM は、インフラの負荷が高まった際、事前通知のうえ強制終了される
- 事前通知されるイベントを検知する仕組みを作り、安全に終了できるようにした
Azure Spot VM
Azure Virtual Machine には、インフラに余力がある場合にのみ利用でき、従量課金制と比べて大幅にディスカウントされる「Azure Spot VM」というサービスがある。
ディスカウント幅は、インフラ側の都合で動的に決定される。Microsoft は最大で90% ディスカウントすると主張している。 一方、インフラの余力が無くなった場合には、30秒前に事前通知したうえで、強制的にシャットダウンするとしている。
また、ユーザから「ここまでディスカウントしてくれるなら使ってもいい。そうでないなら、使うのを止めさせてもらう。」といった宣言も可能で、その場合、インフラの余力がまだ残っていても、価格がユーザ指定値以上になった際にシャットダウンされるようになる。
Azure Metadata Service の Scheduled Events
Spot VM に限らず Azure Virtual Machine には、保守のための再デプロイ(ライブマイグレーション)や再起動など、データがロストする可能性があるイベントが予定された際に、それを VM の内部から検知できる仕組みがある。
以下の様に VM の内部からエンドポイントにアクセスすると、予定されているイベントがあれば JSON で取得できる。
$ curl -H "MetaData:true" "http://169.254.169.254/metadata/scheduledevents?api-version=2019-08-01" { "DocumentIncarnation": {IncarnationID}, "Events": [ { "EventId": ce5f797a-7369-11eb-ba65-a706ed727702, "EventType": "Preempt", "ResourceType": "VirtualMachine", "Resources": ["SpotVM_TEST"], "EventStatus": "Scheduled", "NotBefore": Mon, 15 Feb, 2021 18:29:47 GMT, "Description": "", "EventSource" : "Platform", } ] }
もし、Spot VM がインフラ側の余力不足などで強制削除される場合、その30秒前に EventType
が Preempt
なイベントが通知される。また、Preempt
以外にも以下のイベントが発生する可能性がある。
EventType | 概要 | ロストするデータ |
---|---|---|
Freeze | 一時停止が予定されている。約15分前に発生 | 特になし |
Reboot | 再起動が予定されている。約15分前に発生 | オンメモリ |
Redeploy | ライブマイグレーションが予定されている。約10分前に発生 | 一時ストレージ |
Preempt | Spot VMの削除が予定されている。約30秒前に発生 | すべて |
Terminate | ユーザによる削除が予定されている。(発生タイミングは設定による) | すべて |
エンドポイントをポーリングして、もし、これらのイベントを検知すれば、動かしているプログラムを安全に終了させたり、必要なデータを退避するなどの対応が採れる。
検証環境
検証
Azure Spot VM を作る
具体的な作り方は割愛。閾値を現在価格以下にしてしまうと、そもそも起動できないので、1円上で指定してみた。
検知スクリプトを書く
やっつけだけど、こういうのを書いてみた。とりあえずイベントを検知したら、wall
で警告を挙げて、プロセスを pkill
するだけのシンプルなもの。
MITライセンスで。
結果
まだ、発動していないので、絶賛放置中。かなり渋い価格にしたので直ぐ発動すると思ったんだけど。それとも何かミスったか。