スポットインスタンスの中断。 - Amazon Elastic Compute Cloud

スポットインスタンスの中断。

Amazon EC2 で再びキャパシティーが必要になったときは、予備の EC2 キャパシティーで スポットインスタンス を起動してキャパシティーを戻すのと引き換えに、大幅な割引を受けることができます。Amazon EC2 がスポットインスタンスを再要求した場合、このイベントをスポットインスタンスの中断と呼びます。

スポットインスタンス に対する需要は刻一刻と大幅に変化する可能性があります。また、スポットインスタンス の可用性も利用可能な未使用の EC2 インスタンスの数に応じて大きく変化する可能性があります。スポットインスタンスが中断される可能性は常に存在します。したがって、アプリケーションでスポットインスタンスの中断に対して準備する必要があります。

EC2 フリートまたはスポットフリートで指定されたオンデマンドインスタンスは中断できません。

中断の理由

Amazon EC2 が スポットインスタンス を中断する場合、次のような理由が考えられます。

  • 価格 – スポット料金が上限価格を上回っています。

  • キャパシティー — Amazon EC2 は、必要なときにスポットインスタンスを中断できます。EC2 は、主にキ容量を再利用するためにインスタンスを再利用しますが、ホストのメンテナンスやハードウェアの使用停止などの他の理由でも発生する可能性があります。

  • 制約 – リクエストに、起動グループやアベイラビリティーゾーングループなどの制約を含んでいて、それらの制約条件が満たされなくなった場合には、スポットインスタンスはグループとして終了されます。

インスタンスタイプの過去の中断率は、スポットインスタンスアドバイザーでご確認いただけます。

中断動作

Amazon EC2 がスポットインスタンスを中断させた際に、次のいずれかが実行されるように指定できます。

中断動作を変更するには、「中断動作の指定」を参照してください。

スポットインスタンス の中断の停止

Prerequisites

次の要件が満たされた場合、中断中の スポットインスタンス が Amazon EC2 により 停止されるように、中断動作を指定できます。

  • スポットインスタンスリクエストのタイプpersistent である必要があります。スポットインスタンスリクエストで起動グループを指定することはできません。

  • EC2 フリートまたはスポットフリートのリクエストのタイプmaintain である必要があります。

  • ルートボリュームタイプ – インスタンスストアボリュームではなく、EBS ボリュームにする必要があります。

スポットサービスによって停止されたスポットインスタンスは、そのスポットサービスでのみ再起動できるため、その際も同じ起動仕様が使用されます。

persistent スポットインスタンスリクエストで起動されたスポットインスタンスについては、停止したインスタンスと同じアベイラビリティーゾーンと同じインスタンスタイプで利用可能なキャパシティーがある場合に、スポットサービスがその停止したインスタンスを再起動することができます。

EC2 フリートまたはスポットフリートのインスタンスが停止し、そのフリートのタイプが maintain である場合は、スポットサービスは代替インスタンスを起動してターゲット容量を維持します。スポットサービスでは、指定された配分戦略 (lowestPricediversifiedInstancePoolsToUseCount) に基づき、最適なスポットキャパシティープールを検索します。先に停止したインスタンスは、プールの優先順位に影響しません。後に、配分戦略で、以前に停止したインスタンスを含むプールに導かれる場合、スポットサービスは、ターゲット容量に合うように停止したインスタンスを再起動します。

たとえば、配分戦略が lowestPrice のスポットフリートが再起動の対象になります。初回起動時、c3.large プールは、起動仕様の lowestPrice 条件を満たしています。後に、c3.large インスタンスが中断されると、スポットサービスはそのインスタンスを停止し、lowestPrice 戦略に合う別のプールからキャパシティーを補充します。今回の場合、プールは c4.large プールになり、スポットサービスはターゲット容量を満たすように c4.large インスタンスを起動します。次のタイミングでも同様に、スポットフリートが c5.large プールに移動されます。これらの各遷移では、スポットサービスは、以前に停止したインスタンスを含むプールを優先せずに、指定された配分戦略を純粋に優先します。lowestPrice 戦略では、以前に停止したインスタンスを含むプールに戻る場合があります。たとえば、インスタンスが c5.large プールで中断され、lowestPrice 戦略によって c3.large または c4.large プールに戻った場合、以前に停止したインスタンスはターゲット容量を満たすために再起動されます。

スポットインスタンスが停止している間、そのインスタンスの属性の一部は変更可能ですが、インスタンスタイプを変更することはできません。デタッチまたは削除された EBS ボリュームは、スポットインスタンスが開始した際にアタッチされません。ユーザーがルートボリュームをデタッチし、スポットサービスがスポットインスタンスの開始を試みると、そのインスタンスは開始に失敗し、停止したインスタンスがスポットサービスにより終了されます。

ユーザーは、停止中のスポットインスタンスを終了できます。ユーザーがスポットインスタンスリクエスト、EC2 フリート、またはスポットフリートをキャンセルすると、スポットサービスは、それらに関連付けられていて停止中のスポットインスタンスを終了します。

スポットインスタンスの停止中は、維持されている EBS ボリュームに対してのみ課金されます。EC2 フリートおよびスポットフリートでは、停止中のインスタンスの数が多い場合、アカウント内の EBS ボリューム数の上限を超えることがあります。

中断した スポットインスタンス の休止

休止の前提条件

次の要件が満たされた場合、中断中の スポットインスタンス が Amazon EC2 により休止されるように、中断動作を指定できます。

  • スポットインスタンスリクエストのタイプpersistent である必要があります。スポットインスタンスリクエストで起動グループを指定することはできません。

  • EC2 フリートまたはスポットフリートのリクエストのタイプmaintain である必要があります。

  • サポートされているインスタンスファミリー – C3、C4、C5、M4、M5、R3、R4

  • インスタンス RAM サイズ – 100 GB 未満である必要があります。

  • サポートされるオペレーティングシステム(サポートされたオペレーティングシステムに、休止エージェントをインストールする必要があります。 または、サポートされた (既にエージェントが含まれている) AMI を使用します。):

    • Amazon Linux 2

    • Amazon Linux AMI

    • Ubuntu カーネル (linux-aws) が AWS 向けにチューニング済みの Ubuntu 4.4.0-1041 以降

    • Windows Server 2008 R2 以降

  • サポートされている AMI (次のサポート済みの AMI には、休止エージェントが含まれています。)

    • Amazon Linux 2

    • Amazon Linux AMI 2017.09.1 以降

    • Ubuntu Xenial 16.04 20171121 以降

    • Windows Server 2008 R2 AMI 2017.11.19 以降

    • Windows Server 2012 または Windows Server 2012 R2 AMI 2017.11.19 以降

    • Windows Server 2016 AMI 2017.11.19 以降

    • Windows Server 2019

  • ルートボリュームタイプ – インスタンスストアボリュームではなく、EBS ボリュームにする必要があります。また、休止中にインスタンスメモリ (RAM) を保持するのに十分な大きさが必要です。

  • 休止エージェントの開始 – インスタンスの起動時に、ユーザーデータを使用してエージェントを起動することをお勧めします。または、エージェントを手動で開始できます。

Recommendation

  • 休止中はインスタンスメモリがルートボリュームに格納されるため、暗号化された Amazon EBS ボリュームをルートボリュームとして使用することを強くお勧めします。これにより、データがボリューム上にあるときや、インスタンスとボリューム間でデータが移動しているときに、メモリ (RAM) の内容が暗号化されます。ルートボリュームが暗号化された Amazon EBS ボリュームであることを確認するには、次の 3 つのオプションのいずれかを使用します。

    • EBS の「シングルステップ」暗号化: 1 回の run-instances API 呼び出しで、暗号化されていない AMI から暗号化された EBS-Backed EC2 インスタンスを起動できます。詳細については、「EBS-backed AMI での暗号化の利用」を参照してください。

    • デフォルトでの EBS 暗号化: EBS 暗号化をデフォルトで有効にして、AWS アカウントで作成されたすべての新しい EBS ボリュームを暗号化できます。詳細については、「デフォルトでの暗号化」を参照してください。

    • 暗号化された AMI: 暗号化された AMI を使用してインスタンスを起動することで、EBS 暗号化を有効にすることができます。暗号化されたルートスナップショットが AMI にない場合は、それを新しい AMI にコピーして暗号化をリクエストできます。詳細については、「コピー時に暗号化されていないイメージを暗号化する」および「AMI のコピー」を参照してください。

スポットインスタンスがスポットサービスによって休止された場合は、EBS ボリュームは保持され、インスタンスメモリ (RAM) はルートボリュームに保存されます。インスタンスのプライベート IP アドレスも保存されます。Elastic IP アドレス以外のインスタンスストレージボリュームとパブリック IP アドレスは保持されません。インスタンスが休止状態の間は、EBS ボリュームに対してのみ課金されます。EC2 フリートおよびスポットフリートでは、休止中のインスタンスの数が多い場合、アカウント内の EBS ボリューム数の上限を超えることがあります。

エージェントは、インスタンスがスポットサービスから信号を受信すると、オペレーティングシステムが休止状態になるように要求します。エージェントがインストールされていない場合、基盤となるオペレーティングシステムは休止状態をサポートしていないか、インスタンスメモリを保存するのに十分なボリュームスペースがなく、休止状態が失敗し、代わりにスポットサービスがインスタンスを停止します。

スポットサービスがスポットインスタンスを休止する場合、ユーザーに中断通知が送信されますが、この受信からスポットインスタンスが中断されるまでには 2 分かかりません。休止は直ちに開始されます。インスタンスが休止状態にある間は、インスタンスのヘルスチェックが失敗する場合があります。休止プロセスが完了すると、インスタンスの状態は stopped になります。

休止状態になったスポットインスタンスを再開する

スポットサービスによって休止されたスポットインスタンスは、そのスポットサービスによってのみ再開できます。スポットサービスは、スポット料金が指定された上限料金を下回り、容量が利用可能になったときにインスタンスを再開します。

詳細については、「インスタンス休止の準備」を参照してください。

オンデマンドインスタンス の休止の詳細については、「オンデマンドまたはリザーブドの もしくは Windows インスタンスを休止状態にする」を参照してください。

中断動作の指定

中断動作を指定しない場合、中断された スポットインスタンス はデフォルトで終了します。中断動作は、スポットインスタンスリクエストの作成時に指定できます。中断動作の指定方法は、スポットインスタンス をリクエストする方法によって異なります。

インスタンスの起動ウィザードを使用して スポットインスタンス をリクエストする場合、中断動作を指定するには、[永続的リクエスト] チェックボックスをオンにし、[中断動作] から中断動作を選択します。

スポットコンソールを使用して スポットインスタンス をリクエストする場合、中断動作を指定するには、[ターゲット容量を維持する] チェックボックスをオンにし、[中断動作] から中断動作を選択します。

起動テンプレートで スポットインスタンス を設定する場合、中断動作を指定するには、起動テンプレートで [高度な詳細] を展開し、[スポットインスタンス のリクエスト] チェックボックスをオンにします。[カスタマイズ] をクリックし、[中断動作] から中断動作を選択します。

request-spot-fleet CLI の使用時に起動設定で スポットインスタンス を設定する場合、中断動作を指定するには、InstanceInterruptionBehavior を使用します。

request-spot-instances CLI を使用して スポットインスタンス を設定する場合、中断動作を指定するには、--instance-interruption-behavior を使用します。

中断に対する準備

スポットインスタンス を使用する場合のベストプラクティスを以下に示します。

  • オンデマンド価格であるデフォルトの上限料金を使用します。

  • 必要なソフトウェア設定を含む Amazon Machine Image (AMI) を使用することにより、リクエストが受理されたらすぐにインスタンスを実行できるように、準備が完了していることを確認します。また、ユーザーデータを使用して起動時にコマンドを実行することもできます。

  • スポットインスタンスの終了の影響を受けない場所に、定期的に重要なデータを保存します。たとえば、Amazon S3、Amazon EBS、または DynamoDB を使用できます。

  • 作業を頻繁に保存できるように、作業を (Grid、Hadoop、キューベースのアーキテクチャを使用して) 細かいタスクに分割するか、チェックポイントを使用します。

  • Amazon EC2 は、スポットインスタンスでの中断のリスクが高まった場合に、再調整に関する推奨事項シグナルをそのインスタンスに対し送信します。再調整に関する推奨事項シグナルを利用すると、スポットインスタンス中断 2 分前の通知を待つことなく、スポットインスタンスの中断を事前に管理することができます。詳細については、「EC2 インスタンスの再調整に関する推奨事項」を参照してください。

  • スポットインスタンスのステータスをモニタリングするには、スポットインスタンス中断 2 分前の通知を使用します。詳細については、「スポットインスタンスの中断通知」を参照してください。

  • AWS では、この警告はできるだけ早く提供するよう努めていますが、警告が提供される前にスポットインスタンスが中断されることもあり得ます。再調整に関する推奨事項シグナルと中断通知をモニタリングしている場合でも、予期しないインスタンスの終了をアプリケーションが適切に処理できることを確認します。オンデマンドインスタンス を使用してアプリケーションを実行し、オンデマンドインスタンス を自分で終了することでこれを確認できます。

インスタンス休止の準備

すでにエージェントが含まれている AMI を使用していない限り、インスタンスに休止エージェントをインストールする必要があります。エージェントが AMI に含まれているかどうか、または自分でインストールしたかどうかに関係なく、インスタンスの起動時にエージェントを実行する必要があります。

次の手順は、Windows インスタンスの準備に役立ちます。 Linux インスタンスを準備する手順については、Linux インスタンス用 Amazon EC2 ユーザーガイド の「インスタンス休止の準備」を参照してください。

Windows インスタンスを準備するには

  1. AMI にエージェントが含まれていない場合は、Windows インスタンスの C:\Program Files\Amazon\Hibernate フォルダに次のファイルをダウンロードします。

  2. 以下のコマンドをユーザーデータに追加します。

    <powershell>."C:\Program Files\Amazon\Hibernate\EC2HibernateAgent.exe"</powershell>

スポットインスタンスの中断通知

スポットインスタンスの中断を適切に処理する最善の方法は、耐障害性のあるアプリケーションを設計することです。これを実現するには、スポットインスタンスの中断通知を活用します。スポットインスタンスの中断通知は、Amazon EC2 がスポットインスタンスを停止または終了する 2 分前に発行される警告です。中断動作として休止状態を指定した場合は、中断通知が表示されますが、休止状態プロセスはすぐに開始されるため、2 分間の警告は表示されません。

中断通知は 5 秒ごとに確認することをお勧めします。

この中断通知は、CloudWatch イベントとして、またスポットインスタンス上のインスタンスメタデータの項目としての使用が可能です。イベントは、ベストエフォートベースで出力されます。

EC2 Spot Instance interruption notice

Amazon EC2 がスポットインスタンスを中断しようとすると、実際の中断が起こる 2 分前にイベントが発生します (休止の場合は、即時的にその状態に移行するため、中断通知は発行されますが 2 分前には提供されず、このイベントの対象にはなりません)。このイベントは Amazon CloudWatch Events で検出できます。CloudWatch Eventsの詳細については、「Amazon CloudWatch Events ユーザーガイド」を参照してください。イベントルールの作成および使用方法の詳細な例については、「Taking Advantage of Amazon EC2 スポットインスタンスInterruption Notices」を参照してください。

以下に、スポットインスタンスでの中断イベントの例を示します。instance-action の可能な値は hibernatestopterminate です。

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Spot Instance Interruption Warning", "source": "aws.ec2", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-east-2", "resources": ["arn:aws:ec2:us-east-2:123456789012:instance/i-1234567890abcdef0"], "detail": { "instance-id": "i-1234567890abcdef0", "instance-action": "action" } }

instance-action

スポットサービスが、スポットインスタンスを停止または終了のためにマークした場合、インスタンスメタデータ内に instance-action 項目が含まれるようになります。そうでない場合、これは存在しません。instance-action は以下のように取得できます。

PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/spot/instance-action

instance-action 項目は、アクションおよびアクションのおよその発生時刻 (UTC) を指定します。

次の例では、このインスタンスの停止時刻を示します。

{"action": "stop", "time": "2017-09-18T08:22:00Z"}

次の例では、このインスタンスの終了時刻を示します。

{"action": "terminate", "time": "2017-09-18T08:22:00Z"}

Amazon EC2 がインスタンスを停止または終了する準備をしていない場合や、お客様が自分でインスタンスを終了した場合、instance-action は存在せず、取得しようとした場合、HTTP 404 エラーが出力されます。

termination-time

この項目は下位互換性のために維持されています。代わりに instance-action を使用してください。

スポットサービスがスポットインスタンスを終了のためにマークした場合は、termination-time 項目がインスタンスメタデータ内に含まれるようになります。そうでない場合、これは存在しません。termination-time は以下のように取得できます。

PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/spot/termination-time

termination-time 項目は、インスタンスがシャットダウン信号を受信するおよその時刻 (UTC) を指定します。次に例を示します。

2015-01-05T18:02:00Z

Amazon EC2 がインスタンスを終了する準備をしていない場合や、ユーザーがスポットインスタンスを終了した場合には、termination-time 項目は存在しない (この場合、HTTP 404 エラーが出力されます) か、時刻値以外の値が含まれます。

Amazon EC2 がインスタンスの終了に失敗した場合は、リクエストステータスが fulfilled に設定されます。termination-time 値は、元のおよその時刻のまま (過去の時刻になっていますが)、インスタンスのメタデータに残ります。

中断した スポットインスタンス の検索

コンソールの [Instances (インスタンス)] ペインには、スポットインスタンス を含むすべてのインスタンスが表示されます。スポットインスタンスは、[インスタンスライフサイクル] 列の spot の値から識別できます。[Instance state (インスタンスの状態)] 列には、インスタンスが pendingrunningstoppingstopped, shutting-downterminated のいずれであるかが示されます。休止状態のスポットインスタンスの場合、インスタンスの状態は stopped です。

中断されたスポットインスタンスを検索するには (コンソール)

  1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

  2. ナビゲーションペインで、[インスタンス] を選択します。右上隅にある設定アイコン ( ) を選択し、[Attribute (属性)] 列で [Instance lifecycle (インスタンスライフサイクル)] を選択します。スポットインスタンス の場合、[Instance lifecycle (インスタンスライフサイクル)] は spot です。

    または、ナビゲーションペインで [Spot Requests (スポットリクエスト)] を選択します。スポットインスタンスリクエストとスポットフリートリクエストの両方を表示できます。インスタンスの ID を表示するには、スポットインスタンスリクエストまたはスポットフリートリクエストを選択し、[インスタンス] タブを開きます。インスタンス ID を選択して、[Instances (インスタンス)] ペインにインスタンスを表示します。

  3. 各スポットインスタンスについて、[インスタンスの状態] 列にその状態を表示できます。

中断した スポットインスタンス を検索するには (AWS CLI)

--filters パラメータで describe-instances コマンドを使用すると、中断した スポットインスタンス を一覧表示できます。出力にインスタンス ID のみをリストするには、--query パラメータを追加します。

aws ec2 describe-instances \ --filters Name=instance-lifecycle,Values=spot Name=instance-state-name,Values=terminated,stopped \ --query "Reservations[*].Instances[*].InstanceId"

Amazon EC2 がスポットインスタンスを中断しているかどうかを判断する

スポットインスタンスが停止、休止、終了のいずれかの状態である場合は、CloudTrail を使用して、そのスポットインスタンスを Amazon EC2 が中断しているかどうかを確認できます。AWS CloudTrail では、イベント名が BidEvictedEvent の場合は、Amazon EC2 がスポットインスタンスを中断させたことを示します。

CloudTrail で BidEvictedEvent イベントを表示するには

  1. CloudTrail コンソール (https://console.aws.amazon.com/cloudtrail/) を開きます。

  2. ナビゲーションペインで [Event history (イベント履歴)] を選択します。

  3. フィルターのドロップダウンで、[イベント名] を選択し、右側のフィルターフィールドに [BidEvictedEvent] と入力します。

  4. 結果のリストから [BidEvictedEvent] を選択し、その詳細を表示します。[イベントレコード] で、インスタンス ID を確認できます。

CloudTrail の使用の詳細については、「AWS CloudTrail による Amazon EC2 および Amazon EBS の API 呼び出しのログ記録」を参照してください。

中断された スポットインスタンス の請求

スポットインスタンスが中断された場合は、次のような料金が発生します。

スポットインスタンスを中断するユーザー オペレーティングシステム 最初の 1 時間で中断 最初の 1 時間後の任意の時間に中断

ユーザー自らスポットインスタンスを停止または終了した場合

Windows および Linux (RHEL と SUSE は除く) 使用された時間 (秒) の請求 使用された時間 (秒) の請求
RHEL および SUSE 使用時間が 1 時間未満の場合でも、1 時間分の料金を請求 使用された 1 時間分 (中断された時間が 1 時間未満の場合も 1時間分) を請求

Amazon EC2 スポットサービスがスポットインスタンスを中断した場合

Windows および Linux (RHEL と SUSE は除く) 料金は発生しない 使用された時間 (秒) の請求
RHEL および SUSE 料金は発生しない

使用された 1 時間分は請求されるが、中断された時間が 1 時間未満の場合は請求されない