インスタンスの終了を適切に処理するようにアプリケーションを設計する - 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 でアプリケーションを設計する際には、次の点に留意してください。

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

  • 終了ライフサイクルフックは、インスタンスの終了前に実行または完了することが保証されていません。何らかのエラーが発生した場合でも、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 は、CompleteLifecycleAction呼び出しを受信するか、タイムアウトが経過するかのいずれか早い方まで、インスタンスを終了するように Amazon EC2 に指示しません。

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

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