Amazon EC2 スポットのベストプラクティス - Amazon Elastic Compute Cloud

Amazon EC2 スポットのベストプラクティス

Amazon EC2 では、スポットインスタンスを利用して AWS クラウド にある予備の EC2 コンピューティングキャパシティにアクセスし、オンデマンド料金に比べて最大 90% のコストを節約できます。オンデマンドインスタンスとスポットインスタンスの違いは、Amazon EC2 がキャパシティを再要求する必要がある場合に、Amazon EC2 がスポットインスタンスを中断できることだけです。中断の際には、2 分前に通知があります。スポットインスタンスで快適なエクスペリエンスを得るには、スポットインスタンスを使用するためのベストプラクティスを理解して適用することが重要です。

スポットインスタンス は、ステートレスかつフォールトトレラントで、柔軟性の高いアプリケーションに適しています。例えば、 スポットインスタンス はビッグデータ、コンテナ化されたワークロード、CI/CD、ステートレスウェブサーバー、ハイパフォーマンスコンピューティング (HPC)、レンダリングワークロードに適しています。

実行中、 スポットインスタンス は オンデマンドインスタンス とまったく同じ動作をします。ただし、スポットは、ワークロードが完了するまで十分な期間、実行中のインスタンスが動作し続けることを保証するものではありません。また、スポットは必要としているインスタンスをすぐに取得できること、またはリクエストした総容量がいつでも取得できることを保証するものではありません。さらに、スポットインスタンスの可用性は需要と供給によって変化し、将来のパフォーマンスが過去の実績により保証されるものではないため、スポットインスタンスの容量や発生する中断は、時間の経過とともに変化する可能性があります。

スポットインスタンス は、柔軟性がない、ステートフル、フォールトイントレラント、またはインスタンスノード間で緊密に結合されているワークロードには適していません。また、ターゲットキャパシティが完全に使用できない期間が時折あることが許容されないワークロードには、スポットインスタンスは推奨されません。スポットのベストプラクティスに従ってインスタンスタイプとアベイラビリティーゾーンに柔軟性を持たせることで、高可用性を実現できますが、オンデマンドインスタンスの需要が急増するとスポットインスタンスのワークロードが中断される可能性があるため、容量が使用可能になる保証はありません。

こうしたワークロードにスポットインスタンスを使用したり、中断や停止期間を処理するためにオンデマンドインスタンスへのフェールオーバーを試みたりしないよう、強く勧告します。オンデマンドインスタンスにフェイルオーバーすると、他のスポットインスタンスの中断が誤って発生する可能性があります。さらに、インスタンスタイプとアベイラビリティーゾーンの組み合わせのスポットインスタンスが中断された場合、同じ組み合わせでオンデマンドインスタンスを取得することが困難になる可能性があります。

スポットの使用に慣れている場合でも、スポットインスタンスを使い始めたばかりの場合でも、スポットインスタンスの中断や可用性に関する問題が発生している場合には、スポットサービスを最大限に活用できるよう、これらのベストプラクティスに従うことをお勧めします。

中断に備えて個々のインスタンスを準備する

スポットインスタンスの中断を適切に処理する最善の方法は、耐障害性のあるアプリケーションを設計することです。これを実現するためには、EC2 インスタンスの再調整に関する推奨事項、ならびにスポットインスタンスの中断通知を利用できます。

EC2 インスタンスの再調整に関するレコメンデーションは、スポットインスタンスで中断のリスクが高まった場合に通知するためのシグナルです。ユーザーは、このシグナルにより、スポットインスタンスの中断 2 分前の通知が届いていない段階で、事前にスポットインスタンスの管理を行えます。ワークロードを、中断のリスクが高くない新規または既存の スポットインスタンス に再調整することができます。このシグナルは、Auto Scaling グループと EC2 フリートの容量の再分散機能を使うことで簡単に利用できます。

スポットインスタンスの中断通知は、Amazon EC2 がスポットインスタンスを中断する 2 分前に発行される警告です。ワークロードに時間の面での柔軟性がある場合は、中断が発生した際にそれを終了するのではなく、停止または休止状態になるようにスポットインスタンスを設定することができます。Amazon EC2 は、中断が発生したスポットインスタンスを自動的に停止または休止状態にし、使用可能な容量が確保できた際にはそのインスタンスを自動的に再開します。

再調整に関する推奨事項と中断通知をキャプチャし、ワークロードの進行状況のチェックポイントをトリガーするか、中断を適切に処理するルールを Amazon EventBridge で作成することをお勧めします。詳細については、再調整に関する推奨事項シグナルのモニタリング を参照してください。イベントルールの作成および使用方法の詳細な例については、「Taking Advantage of Amazon EC2 スポットインスタンスInterruption Notices」を参照してください。

詳細については、「EC2 インスタンスの再調整に関する推奨事項」および「スポットインスタンスの中断。」を参照してください。

インスタンスタイプとアベイラビリティーゾーンについて柔軟に対応する

スポットキャパシティープールは、同じインスタンスタイプ (m5.large など) とアベイラビリティーゾーン (us-east-1a など) を持つ、未使用の EC2 インスタンスのセットです。どのインスタンスタイプをリクエストし、どのアベイラビリティーゾーンでワークロードをデプロイするか柔軟に対応することで、スポットが必要な量のコンピューティング性能を見つけ、割り当てられる可能性が高くなります。例えば、c4、m5、m4 ファミリのラージを使用してもよいのであれば、 c5.large を指定する必要はないということです。

具体的なニーズに応じて、コンピューティング要件を満たすためにどのインスタンスタイプを使用できるか評価できます。ワークロードを垂直にスケーリングできる場合は、より大きいインスタンスタイプ (vCPU とメモリが多い) をリクエストに含めてください。水平にしかスケーリングできない場合は、オンデマンドの顧客からの需要が少ない、旧世代のインスタンスタイプを含めることをお勧めします。

一般的に、ワークロードごとに少なくとも 10 種類のインスタンスタイプに柔軟に対応できれば十分です。さらに、すべてのアベイラビリティーゾーンが VPC で使用するように設定され、ワークロード用に選択されていることを確認してください。

属性ベースのインスタンスタイプの選択を使用する

属性ベースのインスタンスタイプの選択では、実行するワークロードに応じて vCPU、メモリ、ストレージなどのインスタンス属性を指定できます。EC2 Auto Scaling または EC2 フリートが、指定の属性に一致するインスタンスを自動的に特定して起動します。これで、特定のインスタンスタイプを手動で選択する手間が省けます。手動で選択するには、各インスタンスタイプが提供するサービスについて深い知識が求められます。

また、属性ベースのインスタンスタイプの選択を使用した場合は、インスタンスタイプが新規にリリースされたら自動的に使用できるようになります。これにより、ますます幅広いスポットインスタンスキャパシティにシームレスにアクセスできるようになります。

属性ベースのインスタンスタイプの選択は、実行先のインスタンスタイプに柔軟に対応できるワークロードとフレームワークに理想的です。例えば、ハイパフォーマンスコンピューティング (HPC) やビッグデータワークロードなどです。

詳細については、「Amazon EC2 Auto Scaling ユーザーガイド」の「Create mixed instances group using attribute-based instance type selection」とこのガイドの「EC2 フリートまたはスポットフリートのインスタンスタイプを選択するための属性を指定する」を参照してください。

スポットプレースメントスコアを使用して最適なリージョンとアベイラビリティーゾーンを特定する

スポットインスタンスは未使用の EC2 キャパシティであり、このキャパシティは EC2 の需要と供給に基づいて変動します。このため、特定の時間に特定の場所で必要になるスポットキャパシティをいつでも正確に取得できるとは限りません。この予測不能性を軽減するために、スポットプレースメントスコア機能を使用できます。これは、スポットキャパシティのニーズを満たせるだけの十分なキャパシティがある可能性が高いリージョンまたはアベイラビリティーゾーンを推奨する機能です。そうしたロケーションで先にスポットインスタンスを起動しておく必要はありません。

スポットプレースメントスコアは、インスタンスタイプとそのタイプで使用可能なリージョンやアベイラビリティーゾーンに柔軟に対応できるワークロードで使用するのに最適です。そのために必要なのは、必要とするスポットキャパシティ、インスタンスタイプ要件、およびリージョンやアベイラビリティーゾーンの推奨が必要かどうかを指定することだけです。これらを指定すると、リージョンまたはアベイラビリティーゾーンごとに 1~10 のスコアが返されます。スコアは、リクエストしたスポットキャパシティを目的のロケーションに正常にプロビジョニングできる可能性を示します。スコア 10 は、スポットリクエストが正常に処理される可能性が非常に高いことを示します。

キャパシティは時間の経過と共に変動するため、スポットプレースメントスコアはあくまでもその時点での推奨であることに留意してください。キャパシティの可用性を保証するものでも、中断のリスクを予測するものでもありません。

スポットプレースメントスコア機能は、Amazon EC2 コンソール、AWS CLI、または SDK で使用できます。詳細については、「スポットプレイスメントスコア」を参照してください。

EC2 Auto Scaling グループまたは EC2 フリートを使用して総容量を管理する

スポットを使用すると、個々のインスタンスの観点からではなく、総容量 (vCPUs、メモリ、ストレージ、またはネットワークスループットなどの単位) の観点から検討することが可能になります。Auto Scaling グループと EC2 フリートは、ターゲットキャパシティの起動および維持のために使用できます。これにより、中断されたり手動で終了されたりしたリソースを置き換えるリソースを自動的に要求できます。Auto Scaling グループまたは EC2 フリートを設定する際には、アプリケーションのニーズに基づいてインスタンスタイプとターゲットキャパシティを指定するだけで済みます。詳細については、Amazon EC2 Auto Scaling ユーザーガイドAuto Scaling グループおよびこのユーザーガイドの EC2 フリートの作成 をご参照ください。

価格と容量を最適化する配分戦略を使用する

Auto Scaling グループの配分戦略を使えば、予備容量を持つスポットキャパシティープールを手動で探す必要なく、ターゲット容量をプロビジョニングできます。最も安い価格で最も利用性の高いスポットキャパシティープールからインスタンスが自動的にプロビジョニングされる、price-capacity-optimized 戦略を使用することをお勧めします。また、EC2 フリートの price-capacity-optimized 配分戦略も活用できます。最適な容量を持つプールからスポットインスタンス容量が供給されるため、使用しているスポットインスタンスが再要求される可能性は低くなります。配分戦略の詳細については、このユーザーガイドの「ワークロードの中断コストが高い場合」および Amazon EC2 Auto Scaling ユーザーガイドの「スポットインスタンス」を参照してください。

統合された AWS のサービスを使用して スポットインスタンス を管理する

他の AWS のサービスは、個々のインスタンスやフリートを管理する必要なく、全体的なコンピューティングコストを削減できるよう、スポットと統合されています。該当するワークロードの場合、Amazon EMR、Amazon Elastic Container Service、AWS Batch、Amazon Elastic Kubernetes Service、Amazon SageMaker、AWS Elastic Beanstalk、Amazon GameLift の各ソリューションを検討することをお勧めします。これらのサービスでのスポットベストプラクティスの詳細については、Amazon EC2 スポットインスタンス Workshops Website を参照してください。

使用すべき最適なスポットリクエスト方法はどれですか?

次の表を使用して、スポットインスタンスをリクエストする際に使用する API を決定します。

API どのようなときに使うか? ユースケース この API を使うべきか?

CreateAutoScalingGroup

  • 単一の構成または混合の構成を持つ、複数のインスタンスが必要です。

  • 構成可能な API を使用してライフサイクル管理を自動化するのがよいでしょう。

必要な数のインスタンスを維持しながら、インスタンスのライフサイクルを管理する Auto Scaling グループを作成します。指定した最小値と最大限度の間の水平スケーリング (インスタンスの追加) をサポートします。

あり
CreateFleet
  • 単一の構成または混合の構成を持つ、複数のインスタンスが必要です。

  • インスタンスのライフサイクルを自己管理するのがよいでしょう。

  • オートスケーリングが必要ない場合は、instant タイプフリートの使用をお勧めします。

インスタンスタイプ別、AMI 別、アベイラビリティーゾーン別、またはサブネット別で異なる、複数の起動条件を指定し、オンデマンドインスタンスとスポットインスタンス両方のフリートを 1 回のリクエストで作成します。スポットインスタンスの割り当てストラテジーのデフォルトは、ユニットあたりの lowest-price ですが、price-capacity-optimizedcapacity-optimized または diversified に変更可能です。

はい - オートスケーリングを必要としない場合は instant モード。

RunInstances
  • 既に RunInstances API を使用してオンデマンドインスタンスを起動しているので、単一のパラメータを変更することで、スポットインスタンスの起動に変更するとよいでしょう。

  • 異なるインスタンスタイプを持つ複数のインスタンスは、必要ありません。

AMI と 1 つのインスタンスタイプを使用して、指定した数のインスタンスを起動します。

いいえ - RunInstances は、1 回のリクエストで複数のインスタンスタイプを許可しないため。

RequestSpotFleet
  • RequestSpotFleet API は計画投資のないレガシー API であるため、使用はお勧めしません。

  • インスタンスのライフサイクルを管理する場合は、CreateFleet API を使用します。

  • インスタンスのライフサイクルを管理したくない場合は、CreateAutoScalingGroup API を使用します。

使用しません。RequestSpotFleet は、計画投資のないレガシー API です。

なし
RequestSpotInstances
  • RequestSpotInstances API は計画投資のないレガシー API であるため、使用はお勧めしません。

使用しません。RequestSpotInstances は、計画投資のないレガシー API です。

なし