Amazon EC2 のスポット インスタンス リクエストは、デフォルトでは 1 回限りのリクエストとして作成されるようになっています。しかし用途によっては、何度でも停止と開始を繰り返せる永続的なスポット リクエストを作成したい場合があります。
EC2 で永続的なスポット インスタンス リクエストを作成する場合の設定方法についてまとめました。
スポット インスタンスの用途 1: Auto Scaling
EC2 のスポット インスタンスには、いくつかの用途があります。代表的なものは、システムの負荷状況に応じて自動的にインスタンス数を増減する、Auto Scaling 設定での利用です。Auto Scaling のもとでは、システムの負荷が高まったタイミングで、事前に設定した AMI をベースにスポット インスタンスが自動的に所定の数まで起動されます。そして負荷が下がると、用途を終えたインスタンスが順々に、自動的に終了させられるというライフサイクルになります。
このようなケースでは、個別のスポット インスタンスは元々一時的な役割しか持ちません。起動された各インスタンスは匿名に近い存在なので、負荷が下がってインスタンスが終了すると跡形もなく消え去る(ストレージは削除され、利用していた IP アドレスも解放される)のは望ましい動作だといえます。
スポット インスタンスの用途 2: 安価なサーバー
一方で、別の目的でスポット インスタンスを利用したいケースもあります。
例えば、開発用やステージング用の安価なサーバーとして、比較的長期間にわたってインスタンスを利用し続けたい場合です。このような用途で、従量課金のオンデマンド インスタンスを利用することももちろんできます。その一方で、キャパシティ不足で一時的に強制停止されるようなタイミングが発生することを許容できるなら、オンデマンド インスタンスよりもはるかに安い価格で利用できるスポット インスタンスは魅力的です。このようなケースでは、インスタンスが毎回 1 回限りで消え去っては不便なので、起動した特定のスポット インスタンスを継続的に、手間なく利用し続けられる必要があります。
永続的なスポット インスタンス リクエストは、このようなケースでの利用に適しています。
永続的なスポット インスタンス リクエストとは
永続的なスポット インスタンス リクエストについて、AWS のドキュメントでは次のように説明されています。
Amazon EC2 がスポットインスタンスを中断した場合、あるいはユーザーがスポットインスタンスを停止した場合に、リクエストが再度開かれるかどうかは、リクエストタイプ(ワンタイムまたは永続)によって決定されることに注意してください。リクエストが永続リクエストの場合、スポットインスタンスの中断後、リクエストが再度開かれます。
永続的な EC2 スポット インスタンス リクエストは、1 回限りのリクエストと異なり、要求したスペックのスポット インスタンスが起動されても、すぐには終了しません。
その代わりに、永続的なスポット インスタンス リクエストはアクティブな状態で残り続け、最初のリクエストに基づいて起動されたスポット インスタンスがキャパシティ不足等で中断された時には、スポット インスタンスの再開をリクエストします。キャパシティが回復し、リクエストが再び充足されると、中断によって停止(または休止)していたスポット インスタンスは再開されます。
また、ユーザー側でインスタンスを停止・再開できるようになることも重要なポイントです。以前は、オンデマンド インスタンスならいつでも自由に停止できる(言い換えると、課金を一時停止できる)のに対して、スポット インスタンスを停止することはできませんでした。このため、誰も利用しないと分かっている夜間や休日であっても、インスタンスを終了して再リクエストする手間を嫌い、スポット インスタンスの料金を(安いとはいえ)払い続けているというケースがありました。永続的なスポット インスタンス リクエストがサポートされたことで、スポット インスタンスを停止できるようになり、もともと安価なスポット インスタンス料金を本当に必要な時にだけ支払えばよくなったといえます。
上で引用した AWS ドキュメントにも書かれているように、スポット インスタンス リクエストのタイプには「1 回限り」と「永続」の 2 種類があります。リクエストの作成後に、リクエストタイプを切り替えることはできません。そのため、リクエストを作成する時の設定が重要になります。
永続的なスポット インスタンス リクエストの作成
AWS コンソールの EC2 画面で永続的なスポット インスタンス リクエストの作成を開始するには、2 つの方法があります。
- [インスタンス] 画面で [インスタンスを起動] ボタンをクリックする
- [イメージ] - [AMI] 画面の AMI リストから特定の AMI を右クリックして [スポットインスタンスをリクエスト] をクリックする
どちらの手順からでも、新しいインスタンスを起動するための Launch an instance 画面が開きます。
作成済みの AMI からスポット インスタンスを起動しようとしている局面では、自然と上記 2 の操作をすることになると思います。その一方、Amazon Linux の最新の AMI から新しくプレーンなスポット インスタンスを起動しようとしている場合などは、上記 1 の操作でスポット リクエスト作成を開始します。
なお、AWS コンソール上には、[インスタンス] 画面とは別に [スポット リクエスト] 画面もあります。この画面に [スポットインスタンスのリクエスト] というボタンが表示されているのですが、こちらのボタンをクリックすると、Launch an instance とは異なる「スポットフリートリクエストの作成」という画面が開きます。
これは用途の異なる画面で、永続的な(1 回限りの場合でも)スポット インスタンスを起動する際には使いません。
リクエスト タイプの指定
永続的なスポット インスタンス リクエストを作成するには、Launch an instance 画面の操作でリクエストタイプを「永続」に指定する必要があります。
まず、Launch an instance 画面の一番下に表示されている [高度な詳細] セクションをクリックして開きます。
[高度な詳細] セクションの中ほどにある [購入オプション] までスクロールして、[なし] から [スポットインスタンス] に切り替えます。なお、[AMI] 画面から [スポットインスタンスをリクエスト] をクリックして Launch an instance 画面を開いた場合は、このオプションはあらかじめ [スポットインスタンス] が選択された状態になっています。
[スポットインスタンス] の下に表示される [スポットインスタンスオプションのカスタマイズ] リンクをクリックします。
隠れていた設定項目が表示されるので、[リクエストタイプ] プルダウンをクリックして開き、[永続] を選択します。
さらに、[中断動作] プルダウンをクリックして開き、「停止」(または「休止」)を選びます。
中断動作のリストにある「停止」と「休止」の違いが気になるかもしれません。停止 (Stop) と休止 (Hibernate) は、日本語表示では似ていますが、違う動作です。
「停止」は通常のシャットダウンです。インスタンスが停止されると、起動しているサーバー プロセスはすべて終了され、その他の終了時処理が行われた後で、インスタンスがいわば電源オフの状態になります。
一方「休止」は、PC を休止状態にする(ハイバネーション)場合と同じで、電源オフの前に RAM の内容がディスクに保存されます。休止していたインスタンスが再開される際には、ディスクから RAM の状態が復元されるとともに、休止前に実行されていたプロセスも再開されます。これにより、インスタンスは休止される前と同じ状態に復元されることになります。
こちらの AWS ドキュメントでも説明されていますが、中断動作として「休止」が選択可能となるにはいくつかの条件があるため、利用する場合には注意が必要です。個人的には、物理サーバーの運用時にハイバネーションを利用しようとは思わないため、同じ理由でスポット インスタンスの中断動作にはいつも「停止」を選んでいます。
以上で、永続的なスポット インスタンス リクエストを作成する準備は完了です。ここまでの操作で、Launch an instance 画面はこのようになっているはずです。
赤い矢印の 3 箇所が、永続的なスポット インスタンス リクエストを作成する際に必要となる設定です。
画面右側の [インスタンスを起動] ボタンをクリックすると、永続的なスポット インスタンス リクエストが作成されます。キャパシティに余裕があれば、すぐにリクエストが充足され、要求したスペックと台数のスポット インスタンスが起動されるはずです。
これで、自由に停止・再開できる永続的なスポット インスタンスが手に入りました。
インスタンス終了時にボリュームを削除しない
永続的なスポット インスタンス リクエストの作成とは直接関係しないものの、同時に利用することの多い設定を 2 点ほど紹介しておきたいと思います。これらの設定は、1 回限りのスポット インスタンスをリクエストする場合や、オンデマンド インスタンスを起動する場合でも利用できる設定です。
- EC2 インスタンスの終了時にボリュームを削除しないようにする
- プライベート IP アドレスを指定する
スポット インスタンスに限らずオンデマンド インスタンスでも、EC2 インスタンスを起動する際のデフォルトの設定では、インスタンス終了と同時にボリュームが自動的に削除されるようになっています。(「終了」とは、停止や休止とは異なり、インスタンスをシャットダウン後に完全に破棄することです。終了されたインスタンスは再開できません)
以前は、永続リクエストがサポートされておらず、スポット インスタンスを停止したり再開することはできなかったため、同一のサーバーを長い間スポット インスタンスで運用し続けるには工夫が必要でした。
その具体的な方法は、インスタンス終了時にボリュームが削除されないように設定しておくことで、スポット インスタンスが中断により終了された後も、ボリュームを再利用できるようにするというものです。残されたボリュームからスナップショットを作成し、スナップショットからさらに AMI を作り、その AMI から新しいスポット インスタンスを起動すれば、スポット インスタンスが中断される直前のディスクの状態を復元して、新しいスポット インスタンスを引き続き運用することができます。
現在サポートされている永続的なスポット インスタンスであれば、中断は発生するとしても明示的に終了しない限りはインスタンスが強制的に終了されることはないので、デフォルト設定のままでもボリュームが不意に削除されることはありません。とはいえ、誤操作によりインスタンスを終了させてしまうケースや、インスタンスの終了後にボリュームだけは残しておきたいケースもあることを考えると、この設定は引き続き有用だといえます。
EC2 インスタンスの終了時にボリュームが削除されないように設定するには、Launch an instance 画面の [ストレージを設定] セクションで [アドバンスド] リンクをクリックします。
ボリューム名、またはボリューム名の左側に表示されているトグル開閉スイッチをクリックします。
ボリュームの詳細な設定項目が表示されるので、[終了時に削除] プルダウンをクリックして開き、[いいえ] を選択すれば設定は完了です。
プライベート IP アドレスを指定する
2 つ目は、EC2 インスタンスに割り当てられるプライベート IP アドレスを指定する方法です。
単独の EC2 インスタンス 1 台を利用する場合には、インスタンスに割り当てられるプライベート IP アドレスを意識する必要はほとんどないかもしれません。インスタンスの開始時に IP アドレスを指定しなければ、AWS によって自動的に IP アドレスが割り当てられます。
一方、VPC 内で複数の EC2 インスタンスが連携して動作しているようなケースでは、インスタンス同士が通信する際に使用するプライベート IP アドレスを明示的に指定しておきたい場合もあります。
プライペート IP アドレスを指定するには、Launch an instance 画面で [ネットワーク設定] セクションの [編集] ボタンをクリックします。
使用するネットワーク (VPC) とサブネット設定を確認します。VPC はデフォルト VPC が選択された状態になっていますが、[サブネット] プルダウンは「指定なし」が選択されています。
サブネットを指定しない場合は、インスタンスの起動時に AWS によってサブネットが自動選択されます。利用可能な IP アドレス範囲はサブネットごとに異なるため、サブネットを指定しない場合は当然ながらプライベート IP アドレスを指定することもできません。
そのため、インスタンスを起動するサブネットを指定します。
サブネットを選択すると、セクションの末尾に [高度なネットワーク設定] が表示されるので、クリックして開きます。
起動するインスタンスに割り当てたいプライベート IP アドレスを [プライマリ IP] に入力すれば設定は完了です。
入力する IP アドレスは、選択したサブネットの範囲内の IP アドレスである必要があります。また、すでに他の EC2 インスタンスに割り当てられている IP アドレスは使用できません。間違った IP アドレスや、すでに使用されている IP アドレスを入力した場合、Launch an instance 画面上ではエラーチェックは行われませんが、起動時に失敗してエラーメッセージが表示されます。エラーが発生した場合は、もう一度 Launch an instance 画面に戻って IP アドレスを指定しなおします。
まとめ
この記事では、Amazon EC2 で永続的なスポット インスタンス リクエストを作成する方法について説明しました。永続リクエストを利用すると、停止・再開可能なスポット インスタンスを起動することができます。
永続的なスポット インスタンスの作成に必要な設定は以下のとおりです。
- 購入オプションとして「スポットインスタンス」を選びます。
- リクエストタイプとして「永続」を選びます。
- 中断動作として「停止」または「休止」を選びます。
- インスタンスの終了時にボリュームを削除しない
- プライベート IP アドレスを指定する