kWatanabe 記事一覧へ

kWatanabe の 技術帖

某企業でOSや仮想化の研究をやっているインフラ系エンジニア。オンプレとクラウドのコラボレーションなど、興味ある技術を綴る。

Azure Spot VM の強制削除イベントをハンドルして安全に終了する

  • Azure や AWS には大幅なディスカウントのある Spot VM インスタンスがある
  • Azure の Spot VM は、インフラの負荷が高まった際、事前通知のうえ強制終了される
  • 事前通知されるイベントを検知する仕組みを作り、安全に終了できるようにした

Azure Spot VM

Azure Virtual Machine には、インフラに余力がある場合にのみ利用でき、従量課金制と比べて大幅にディスカウントされる「Azure Spot VM」というサービスがある。

azure.microsoft.com

ディスカウント幅は、インフラ側の都合で動的に決定される。Microsoft は最大で90% ディスカウントすると主張している。 一方、インフラの余力が無くなった場合には、30秒前に事前通知したうえで、強制的にシャットダウンするとしている。

また、ユーザから「ここまでディスカウントしてくれるなら使ってもいい。そうでないなら、使うのを止めさせてもらう。」といった宣言も可能で、その場合、インフラの余力がまだ残っていても、価格がユーザ指定値以上になった際にシャットダウンされるようになる。

Azure Metadata Service の Scheduled Events

Spot VM に限らず Azure Virtual Machine には、保守のための再デプロイ(ライブマイグレーション)や再起動など、データがロストする可能性があるイベントが予定された際に、それを VM の内部から検知できる仕組みがある。

docs.microsoft.com

以下の様に 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秒前に EventTypePreempt なイベントが通知される。また、Preempt 以外にも以下のイベントが発生する可能性がある。

EventType 概要 ロストするデータ
Freeze 一時停止が予定されている。約15分前に発生 特になし
Reboot 再起動が予定されている。約15分前に発生 オンメモリ
Redeploy ライブマイグレーションが予定されている。約10分前に発生 一時ストレージ
Preempt Spot VMの削除が予定されている。約30秒前に発生 すべて
Terminate ユーザによる削除が予定されている。(発生タイミングは設定による) すべて

エンドポイントをポーリングして、もし、これらのイベントを検知すれば、動かしているプログラムを安全に終了させたり、必要なデータを退避するなどの対応が採れる。

検証環境

検証

Azure Spot VM を作る

具体的な作り方は割愛。閾値を現在価格以下にしてしまうと、そもそも起動できないので、1円上で指定してみた。

検知スクリプトを書く

やっつけだけど、こういうのを書いてみた。とりあえずイベントを検知したら、wall で警告を挙げて、プロセスを pkill するだけのシンプルなもの。

MITライセンスで。

github.com

結果

まだ、発動していないので、絶賛放置中。かなり渋い価格にしたので直ぐ発動すると思ったんだけど。それとも何かミスったか。

まとめ

  • Azure Spot VM の強制終了前に、それを検知し後片付けするスクリプトを書いてみた。
  • これで、Spot VM を安全に使えるはず・・・だが、まだ結果は分からない。