インスタンスの終了を的確に処理するようにアプリケーションを設計する - Amazon EC2 Auto Scaling

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

インスタンスの終了を的確に処理するようにアプリケーションを設計する

このトピックでは、Auto Scaling グループがまだ終了の準備ができていないインスタンスを終了したり、割り当てられたジョブを完了させるには早すぎる状態でインスタンスを終了したりしないようにするために使用できる機能について説明します。これらの 3 つの機能をすべて組み合わせて使用することも、個別に使用して、インスタンスの終了を的確に処理するようにアプリケーションを設計することもできます。

例えば、長時間実行されるジョブの受信メッセージを収集する Amazon SQS キューがあるとします。新しいメッセージが到達すると、Auto Scaling グループのインスタンスがメッセージを取得し、処理を開始します。各メッセージの処理には 3 時間かかります。メッセージの数が増えると、新しいインスタンスが Auto Scaling グループに自動的に追加されます。メッセージの数が少なくなると、既存のインスタンスは自動的に終了します。この場合、Amazon EC2 Auto Scaling は終了するインスタンスを決定する必要があります。デフォルトでは、Amazon EC2 Auto Scaling は、現在アイドル状態のインスタンスではなく、3 時間のジョブの処理に 2.9 時間かかるインスタンスを終了する可能性があります。Amazon EC2 Auto Scaling を使用する際の予期しない終了の問題を回避するには、このシナリオに対応するようにアプリケーションを設計する必要があります。

重要

インスタンスの終了を適切に処理するように Amazon EC2 Auto Scaling でアプリケーションを設計する場合は、次の点に注意してください。

  • インスタンスに異常がある場合、Amazon EC2 Auto Scaling は、使用する機能に関係なく (ReplaceUnhealthyプロセスを停止しない限り)、インスタンスを置き換えます。ライフサイクルフックを使用すると、アプリケーションは、正常にシャットダウンしたり、インスタンスの終了前に回復する必要があるデータをコピーしたりできます。

  • 終了ライフサイクルフックは、インスタンスの終了前に実行または完了することが保証されていません。何かが失敗しても、Amazon EC2 Auto Scaling はインスタンスを終了します。

インスタンスのスケールイン保護

インスタンスのスケールイン保護は、インスタンスの終了が、デフォルトで拒否され、かつ、特定のインスタンスについてのみ明示的に許可されるべき重要なアクションである多くの状況で使用できます。例えば、コンテナ化されたワークロードを実行する場合、すべてのインスタンスを保護し、現在のタスクやスケジュールされたタスクがないインスタンスについてのみ保護を解除したいと考えるのが一般的です。Amazon ECS などのサービスでは、インスタンスのスケールイン保護との統合が製品に組み込まれています。

Auto Scaling グループでスケールイン保護を有効にして、インスタンスの作成時にスケールイン保護を適用したり、既存のインスタンスのためにそれを有効にしたりできます。インスタンスで実行する作業がなくなった場合、保護をオフに切り替えることができます。インスタンスは新しいジョブのためにポーリングを続行し、新しいジョブが割り当てられたら保護を再度有効にすることができます。

アプリケーションは、インスタンスが終了可能かどうかを管理する一元的なコントロールプレーンから、またはインスタンス自体から保護を設定できます。ただし、多数のインスタンスがスケールイン保護を継続的に切り替えている場合、大規模なフリートでスロットリングの問題が発生する可能性があります。

詳細については、「インスタンスのスケールイン保護を使用してインスタンスの終了を制御する」を参照してください。

カスタム終了ポリシー

インスタンスのスケールイン保護と同様に、カスタム終了ポリシーは、Auto Scaling グループが特定のインスタンスを終了しないようにするのに役立ちます。

デフォルトでは、Auto Scaling グループはデフォルトの終了ポリシーを使用して、最初に終了するインスタンスを決定します。どのインスタンスが最初に終了するかをさらに制御したい場合は、Lambda 関数を使用して独自のカスタム終了ポリシーを実装できます。Amazon EC2 Auto Scaling は、終了するインスタンスを決定する必要があるたびに関数を呼び出します。関数によって返されたインスタンスのみが終了します。関数がエラー、タイムアウト、または空のリストを生成した場合、Amazon EC2 Auto Scaling はインスタンスを終了しません。

カスタム終了ポリシーは、インスタンスが十分に冗長であるか、または十分に活用されていないためにインスタンスを終了できることがわかっている場合に役立ちます。これをサポートするには、グループ全体のワークロードをモニタリングするコントロールプレーンを備えたアプリケーションを実装する必要があります。これにより、インスタンスがまだジョブを処理している場合、Lambda 関数はそのインスタンスを含めてはならないことを認識できます。

詳細については、「Lambda を使用したカスタム終了ポリシーを作成する」を参照してください。

終了ライフサイクルフック

終了ライフサイクルフックは、既に終了対象として選択されているインスタンスの寿命を延長します。これにより、現在インスタンスに割り当てられているすべてのメッセージまたはリクエストを完了するため、または進行状況を保存して作業を別のインスタンスに転送するための追加の時間を確保できます。

多くのワークロードでは、終了対象として選択されたインスタンス上のアプリケーションを正常にシャットダウンするには、ライフサイクルフックで十分な場合があります。これはベストエフォート型のアプローチであり、エラーが発生した場合の終了を防ぐために使用することはできません。

ライフサイクルフックを使用するには、インスタンスの終了がいつ選択されるかを知る必要があります。これを知るには 2 つの方法があります。

オプション 説明 最適なケース ドキュメントへのリンク
インスタンス内 インスタンスメタデータサービス (IMDS) は、インスタンスのステータスをインスタンスから直接ポーリングできる安全なエンドポイントです。メタデータが Terminated で返された場合、インスタンスの終了がスケジュールされています。 インスタンスを終了する前に、インスタンスに対してアクションを実行する必要があるアプリケーション。 ターゲットライフサイクル状態を取得する
インスタンス外 インスタンスが終了する際に、イベント通知が生成されます。Amazon EventBridge、Amazon SQS、または Amazon SNS を使用してルールを作成してこれらのイベントをキャプチャし、Lambda 関数で などのレスポンスを呼び出すことができます。 インスタンスの外部でアクションを実行する必要があるアプリケーション。 通知ターゲットを作成する

ライフサイクルフックを使用するには、インスタンスの終了準備が完全に整うタイミングを知る必要もあります。Amazon EC2 Auto Scaling は、EC2 コールを受信するか、タイムアウトが経過するかのいずれか早い方まで、インスタンスを終了するように Amazon CompleteLifecycleAction に指示しません。

デフォルトでは、インスタンスは終了ライフサイクルフックにより、引き続き 1 時間にわたって実行できます (ハートビートタイムアウト)。ライフサイクルアクションを完了するのに 1 時間では足りない場合は、デフォルトのタイムアウトを設定できます。ライフサイクルアクションが実際に進行中の場合は、RecordLifecycleActionHeartbeat API呼び出しでタイムアウトを延長できます。

詳細については、「Amazon EC2 Auto Scaling のライフサイクルフック」を参照してください。