ターミナル上でAWS EC2スポットインスタンスを手軽に調べられ、取得したスポット情報をスクリプトや自動化にも活用できる、オープンソースのコマンドラインツール「spotinfo」を紹介します。

コマンドラインからAWSスポットインスタンスを探索
TL;DR
spotinfoは、複数のAWSリージョンをまたいでAWS Spotインスタンスを調べられるコマンドラインツールです。
はじめに
Amazon EC2 Spotインスタンスは、EC2のオンデマンド料金を最大90%削減できる強力な選択肢です。VMの中断に耐えられるworkload、あるいは一時停止と再開がビジネス上問題にならないworkloadであれば、Spot料金モデルを使わない手はありません。
中断率が低いほど、Spotインスタンスは長く稼働し続けられる可能性が高まります。
AWSは、利用可能なSpotインスタンスを調べ、中断リスクが最も低いスポットインスタンスプールを見つけられる優れたWebインターフェースAWS Spot Instance Advisorを提供しています。オンデマンド料金と比較した割引率も確認でき、これらの指標をもとに適切なSpotインスタンスを選ぶ、という流れになります。
AWS Spot Instance Advisorは便利なツールではあるものの、そのデータをスクリプトや自動化に取り込むのは簡単ではなく、ユースケースによってはクリック数が多すぎて使いにくい場面もあります。
spotinfoツール
そこで開発したのがspotinfoです。Apache 2.0ライセンスのオープンソースで提供される使いやすいコマンドラインツールで、ターミナルからAWS Spotインスタンスを調べたり、得られたスポット情報をスクリプトや自動化に組み込んだりできます。
spotinfoは内部的に、AWSが公開している次の2つのデータソースを利用しています。
機能
spotinfoを使えば、AWS Spot Instance Advisorで見られるのと同じ情報をコマンドラインから取得でき、スクリプトや自動化のユースケースにそのまま組み込めます。さらに、AWS Spot Instance AdvisorのWebインターフェースにはない便利な機能もいくつか備えています。
高度なフィルタリング
1つ目の機能は_高度なフィルタリング_です。次の条件でスポットインスタンスを絞り込めます。
- vCPU — CPUコア数の下限
- Memory GiB — メモリサイズの下限
- OS — LinuxまたはWindows
- リージョン — 1つ以上のAWSリージョン(
allで全リージョン指定も可) - 割引率(オンデマンド比)
- 中断頻度
- 時間単価(
USD/hour)
インスタンスタイプによるフィルタリングでは正規表現が使えるので、より高度なクエリも組み立てられます。
例:正規表現によるフィルタリング
Graviton2プロセッサ搭載で8 CPUコア以上のEC2 Spotインスタンスをus-west-2(オレゴン)リージョンから一覧表示し、スポット価格でソートしてテキスト形式で出力します。
https://gist.github.com/9a22c748a6697c58a555702b709205b9
スポット価格の可視化
AWS Spot Instance AdvisorではオンデマンドEC2インスタンス料金からの割引率は確認できますが、実際に支払う価格を知るには別途AWS Spot Pricingのページを開き、該当インスタンスタイプを再度検索する必要があります。
spotinfoならその手間を省き、スポット価格を他の情報と並べて表示できます。スポット価格によるフィルタリングやソートも可能です。
柔軟な出力フォーマット
コマンドラインでデータを扱い、スクリプトや自動化から呼び出すには、出力フォーマットの柔軟性が欠かせません。spotinfoは、tableやプレーンなtextといった人間に読みやすい形式に加え、jsonやcsv、あるいは割引率の数値のみといった自動化向けの形式まで、複数の形式で結果を返せます。ユースケースに合わせて最適な形式を選んでください。
複数リージョンをまたいだSpotの比較
AWS Spot Instance Advisorのもどかしい点のひとつが、複数のAWSリージョンをまたいでEC2スポットインスタンスを比較できないことです。表示できるのは単一リージョンのみで、複数リージョンを見比べるにはブラウザタブを複数開き、行ったり来たりするしかありません。
spotinfoを使えば、複数のAWSリージョンをまたいでスポットインスタンスを比較できます。やり方は簡単で、--regionフラグを渡すだけ。このフラグは複数回指定することもできます。
もうひとつのやり方は、特別な値all(--region=all)を指定する方法です。これで利用可能なすべてのAWSリージョンのスポットインスタンスをまとめて確認できます。
例:t4g.small Spotインスタンスを調べる
t4g.smallスポットインスタンスの提供状況と料金を、このインスタンスタイプが利用可能なすべてのAWSリージョンについて確認します。
https://gist.github.com/2b7a92a6126f21edac2319cd1507c352
ネットワーク耐性
spotinfoはAWSの公開データフィードを利用しますが、同じデータをツール内部にも埋め込んでいます。そのため、ネットワーク不通やサービス停止などでデータフィードにアクセスできない場合でも、spotinfoは同じ結果を返せます。
まとめ
spotinfoがAWS EC2スポットインスタンスを調べる際の助けになれば幸いです。コメントやご質問をお待ちしています。
alexei-led/spotinfo GitHubプロジェクトへのコントリビューション(Issue、機能提案、プルリクエスト)も歓迎します。
p.s. spotinfoを気に入っていただけたら、GitHubのプロジェクトに⭐️をいただけると嬉しいです。
お読みいただきありがとうございました! 最新情報は DoiT Engineering Blog、DoiT LinkedInチャンネル、DoiT Twitterチャンネルでお届けしています。採用情報はhttps://careers.doit.comをご覧ください。