スポットインスタンス の中断
Amazon EC2 で再びキャパシティーが必要になったときは、予備の EC2 キャパシティーで スポットインスタンス を起動してキャパシティーを戻すのと引き換えに、大幅な割引を受けることができます。Amazon EC2 が スポットインスタンス を再要求した場合、このイベントをスポットインスタンスの中断と呼びます。
スポットインスタンス に対する需要は刻一刻と大幅に変化する可能性があります。また、スポットインスタンス の可用性も利用可能な未使用の EC2 インスタンスの数に応じて大きく変化する可能性があります。スポットインスタンス が中断される可能性は常にあります。したがって、アプリケーションで スポットインスタンス の中断に対して準備する必要があります。
EC2 フリート または スポットフリート で指定した オンデマンドインスタンス は中断されません。
目次
中断の理由
Amazon EC2 が スポットインスタンス を中断する場合、次のような理由が考えられます。
-
価格 – スポット料金が上限料金を上回っています。
-
容量 – オンデマンドインスタンス の需要を満たすのに十分な未使用の EC2 インスタンスがない場合、Amazon EC2 は スポットインスタンス を中断します。インスタンスが中断される順序は、Amazon EC2 によって決定されます。
-
制約 – リクエストに起動グループやアベイラビリティーゾーングループなど制約が含まれている場合、制約条件が満たされなくなったときに、その スポットインスタンス はグループとして終了されます。
中断動作
Amazon EC2 が スポットインスタンス を中断させるときに、次のいずれかを実行するように指定できます。
-
スポットインスタンス を停止させる
-
スポットインスタンス を休止させる
-
スポットインスタンス を終了させる
デフォルトでは、スポットインスタンス は中断されると終了されます。中断動作を変更するには、「中断動作の指定」を参照してください。
中断した スポットインスタンス の停止
次の要件が満たされた場合、中断した スポットインスタンス を Amazon EC2 で停止させるように中断動作を指定できます。
要件
-
スポットインスタンス リクエストの場合、タイプは
persistent
にする必要があります。スポットインスタンス リクエストで起動グループを指定することはできません。 -
EC2 フリート または スポットフリート リクエストの場合、タイプは
maintain
にする必要があります。 -
ルートボリュームは、インスタンスストアボリュームではなく EBS ボリュームにする必要があります。
スポットインスタンス がスポットサービスによって停止されたら、スポットインスタンス はスポットサービスでのみ再起動できるため、同じ起動仕様を使用する必要があります。
persistent
スポットインスタンス リクエストで起動された スポットインスタンス の場合、キャパシティーが、停止したインスタンスと同じアベイラビリティーゾーンで利用可能、かつ同じインスタンスタイプの場合に、スポットサービスによって、その停止したインスタンスは再起動されます。
EC2 フリート または スポットフリート インスタンスが停止し、フリートのタイプが maintain
の場合、スポットサービスは代替インスタンスを起動してターゲット容量を維持します。スポットサービスでは、指定された配分戦略 (lowestPrice
、diversified
、InstancePoolsToUseCount
) に基づき、最適なプールを検索します。以前に停止したインスタンスでプールに優先順位が付けられることはありません。後に、配分戦略で、以前に停止したインスタンスを含むプールに導かれる場合、スポットサービスは、ターゲット容量に合うように停止したインスタンスを再起動します。
たとえば、配分戦略が 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
にする必要があります。 -
ルートボリュームはインスタンスストアボリュームではなく、EBS ボリュームでなければならず、休止中にインスタンスメモリ (RAM) を格納するのに十分な大きさでなければなりません。
-
C3、C4、C5、M4、M5、R3、R4 (100 GB 未満のメモリ) のインスタンスがサポートされています。
-
以下のオペレーティングシステムがサポートされています: Amazon Linux 2、Amazon Linux AMI、AWS チューニングされた Ubuntu カーネル (linux-aws) 4.4.0-1041 以降の Ubuntu、および Windows Server 2008 R2 以降。
-
サポートされているオペレーティングシステムに休止エージェントをインストールするか、すでにエージェントが含まれている次の 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
-
-
エージェントを開始します。インスタンスの起動時にユーザーデータを使用してエージェントを起動することをお勧めします。または、エージェントを手動で開始できます。
推奨事項
-
休止中はインスタンスメモリがルートボリュームに格納されるため、暗号化された 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
になります。
休止状態の スポットインスタンス の再開
スポットインスタンス がスポットサービスによって休止状態になった後は、スポットサービスによってのみ再開できます。スポットサービスは、スポット料金が指定された上限料金を下回り、容量が利用可能になったときにインスタンスを再開します。
詳細については、「インスタンス休止の準備」を参照してください。
オンデマンドインスタンス の休止の詳細については、「Linux インスタンスの休止」を参照してください。
中断動作の指定
中断動作を指定しない場合、中断された スポットインスタンス はデフォルトで終了します。中断動作は、スポットリクエストの作成時に指定できます。中断動作の指定方法は、スポットインスタンス をリクエストする方法によって異なります。
インスタンスの起動ウィザードを使用して スポットインスタンス をリクエストする場合、中断動作を指定するには、[永続的リクエスト] チェックボックスをオンにし、[中断動作] から中断動作を選択します。
スポットコンソールを使用して スポットインスタンス をリクエストする場合、中断動作を指定するには、[ターゲット容量を維持する] チェックボックスをオンにし、[中断動作] から中断動作を選択します。
起動テンプレートで スポットインスタンス を設定する場合、中断動作を指定するには、起動テンプレートで [高度な詳細] を展開し、[スポットインスタンス のリクエスト] チェックボックスをオンにします。[カスタマイズ] をクリックし、[中断動作] から中断動作を選択します。
request-spot-fleet CLI の使用時に起動設定で スポットインスタンス を設定する場合、中断動作を指定するには、InstanceInterruptionBehavior
を使用します。
request-spot-instances CLI を使用して スポットインスタンス を設定する場合、中断動作を指定するには、--instance-interruption-behavior
を使用します。
中断に対する準備
スポットインスタンス を使用する場合のベストプラクティスを以下に示します。
-
オンデマンド価格であるデフォルトの上限料金を使用します。
-
必要なソフトウェア設定を含む Amazon Machine Image (AMI) を使用することにより、リクエストが受理されたらすぐにインスタンスを実行できるように、準備が完了していることを確認します。また、ユーザーデータを使用して起動時にコマンドを実行することもできます。
-
スポットインスタンス の終了の影響を受けない場所に、定期的に重要なデータを保存します。たとえば、Amazon S3、Amazon EBS、または DynamoDB を使用できます。
-
作業を頻繁に保存できるように、作業を (Grid、Hadoop、キューベースのアーキテクチャを使用して) 細かいタスクに分割するか、チェックポイントを使用します。
-
スポットインスタンス の中断の通知を使用して、スポットインスタンスのステータスをモニタリングします。
-
AWS では、この警告はできるだけ早く提供するよう努めていますが、警告が提供される前に スポットインスタンス が削除される可能性があります。アプリケーションをテストして、中断通知のテストを行っている場合であっても、予期しないインスタンスの終了をアプリケーションが適切に処理できることを確認します。オンデマンドインスタンス を使用してアプリケーションを実行し、オンデマンドインスタンス を自分で終了することでこれを確認できます。
インスタンス休止の準備
すでにエージェントが含まれている AMI を使用していない限り、インスタンスに休止エージェントをインストールする必要があります。エージェントが AMI に含まれているかどうか、または自分でインストールしたかどうかに関係なく、インスタンスの起動時にエージェントを実行する必要があります。
次の手順は、Linux インスタンスの準備に役立ちます。Windows インスタンスを準備する手順については、Windows インスタンスの Amazon EC2 ユーザーガイドの「インスタンス休止の準備」を参照してください。
Amazon Linux インスタンスを準備するには
-
カーネルが休止をサポートしていることを確認し、必要に応じてカーネルを更新します。
-
AMI にエージェントが含まれていない場合は、次のコマンドを使用してエージェントをインストールします。
sudo yum update; sudo yum install hibagent
-
以下をユーザーデータに追加します。
#!/bin/bash /usr/bin/enable-ec2-spot-hibernation
Ubuntu インスタンスを準備するには
-
AMI にエージェントが含まれていない場合は、次のコマンドを使用してエージェントをインストールします。休止状態のエージェントは、Ubuntu 16.04 以降でのみ使用できます。
sudo apt-get install hibagent
-
以下をユーザーデータに追加します。
#!/bin/bash /usr/bin/enable-ec2-spot-hibernation
スポットインスタンス 中断の通知
スポットインスタンス の中断を適切に処理する最善の方法は、アプリケーションをフォールトトレラントに設計することです。これを実現するには、スポットインスタンス 中断通知を活用します。スポットインスタンス 中断の通知は、 Amazon EC2 が スポットインスタンス を停止または終了する 2 分前に発行される警告です。中断動作として休止状態を指定した場合は、中断通知が表示されますが、休止状態プロセスはすぐに開始されるため、2 分間の警告は表示されません。
中断通知は 5 秒ごとに確認することをお勧めします。
この中断通知は、CloudWatch イベントとして、また スポットインスタンス 上のインスタンスメタデータの項目として使用可能です。
EC2 スポットインスタンス interruption notice
Amazon EC2 が スポットインスタンス を中断しようとすると、中断が起こる 2 分前にイベントが発生します (休止は例外。休止する場合、中断通知は発行されますが、休止がすぐに開始されるため、2
分前には発生しません)。このイベントは Amazon CloudWatch Events で検出できます。CloudWatch イベントの詳細については、Amazon CloudWatch Events ユーザーガイドを参照してください。イベントルールの作成および使用方法の詳細な例については、「Taking Advantage of Amazon EC2 Spot Instance Interruption Notices
以下に示しているのは、スポットインスタンス 割り込みのイベントの例です。instance-action
の可能な値は hibernate
、stop
、terminate
です。
{
"version": "0",
"id": "12345678-1234-1234-1234-123456789012
",
"detail-type": "EC2 Spot Instance Interruption Warning",
"source": "aws.ec2",
"account": "123456789012
",
"time": "yyyy
-mm
-dd
Thh
:mm
:ss
Z",
"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
は以下のように取得できます。
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
は以下のように取得できます。
termination-time
項目は、インスタンスがシャットダウン信号を受信するおよその時刻 (UTC) を指定します。例:
2015-01-05T18:02:00Z
Amazon EC2 がインスタンスを終了する準備をしていない場合や、お客様が自分で スポットインスタンス を終了した場合、termination-time
項目は存在しない (この場合、HTTP 404 エラーが出力されます) か、時刻値以外の値が含まれます。
Amazon EC2 がインスタンスの終了に失敗した場合は、リクエストステータスが fulfilled
に設定されます。termination-time
値は、元のおよその時刻のまま (過去の時刻になっていますが)、インスタンスのメタデータに残ります。
中断した スポットインスタンス の検索
コンソールの [Instances (インスタンス)] ペインには、スポットインスタンス を含むすべてのインスタンスが表示されます。スポットインスタンス は、[Instance lifecycle (インスタンスライフサイクル)] 列の spot
の値から識別できます。[Instance state (インスタンスの状態)] 列には、インスタンスが pending
、running
、stopping
、stopped
, shutting-down
、terminated
のいずれであるかが示されます。休止状態の スポットインスタンス の場合、インスタンスの状態は stopped
です。
中断した スポットインスタンス (コンソール) を検索するには
-
https://console.aws.amazon.com/ec2/
で Amazon EC2 コンソールを開きます。 -
ナビゲーションペインで、[インスタンス] を選択します。右上隅にある設定アイコン (
) を選択し、[Attribute (属性)] 列で [Instance lifecycle (インスタンスライフサイクル)] を選択します。スポットインスタンス の場合、[Instance lifecycle (インスタンスライフサイクル)] は
spot
です。または、ナビゲーションペインで [Spot Requests (スポットリクエスト)] を選択します。スポットインスタンス リクエストと スポットフリート リクエストの両方を参照することができます。インスタンスの ID を表示するには、スポットインスタンス リクエストまたは スポットフリート リクエストを選択し、[Instances (インスタンス)] タブを選択します。インスタンス ID を選択して、[Instances (インスタンス)] ペインにインスタンスを表示します。
-
各 スポットインスタンス について、[Instance State (インスタンスの状態)] 列にその状態を表示できます。
中断した スポットインスタンス (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 が スポットインスタンス を中断させたかどうかの確認
スポットインスタンス が停止、休止、終了のいずれかの状態である場合、Amazon EC2 が スポットインスタンス を中断させたかどうかを CloudTrail で確認できます。CloudTrail
で、イベント名 BidEvictedEvent
は、Amazon EC2 が スポットインスタンス を中断させたことを示します。CloudTrail の使用の詳細については、「AWS CloudTrail による Amazon EC2 および Amazon EBS の API コールのログ記録」を参照してください。
中断された スポットインスタンス の請求
スポットインスタンス (Spot ブロックではない) が中断された場合は、次のように請求されます。
スポットインスタンス を中断するユーザー | オペレーティングシステム | 最初の 1 時間で中断 | 最初の 1 時間後の任意の時間に中断 |
---|---|---|---|
お客様がスポットインスタンスを停止または終了した場合 |
Linux (RHEL および SUSE は除く) | 使用された時間 (秒) の請求 | 使用された時間 (秒) の請求 |
Windows、RHEL、SUSE | 使用時間が 1 時間未満の場合でも、1 時間分の料金を請求 | 使用された 1 時間分 (中断された時間が 1 時間未満の場合も 1時間分) を請求 | |
Amazon EC2 で スポットインスタンス が中断された場合 |
Linux (RHEL および SUSE は除く) | 料金は発生しない | 使用された時間 (秒) の請求 |
Windows、RHEL、SUSE | 料金は発生しない |
使用された 1 時間分は請求されるが、中断された時間が 1 時間未満の場合は請求されない |
スポットインスタンス (Spot ブロック内) が中断された場合は、次のように請求されます。
スポットインスタンス を中断するユーザー | オペレーティングシステム | 最初の 1 時間で中断 | 最初の 1 時間後の任意の時間に中断 |
---|---|---|---|
お客様がスポットインスタンスを停止または終了した場合 |
Linux (RHEL および SUSE は除く) | 使用された時間 (秒) の請求 | 使用された時間 (秒) の請求 |
Windows、RHEL、SUSE | 使用時間が 1 時間未満の場合でも、1 時間分の料金を請求 | 使用された 1 時間分 (中断された時間が 1 時間未満の場合も 1時間分) を請求 | |
Amazon EC2 で スポットインスタンス が中断された場合 |
Linux (RHEL および SUSE は除く) | 料金は発生しない | 料金は発生しない |
Windows、RHEL、SUSE | 料金は発生しない |
料金は発生しない |