翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
インスタンスの終了を的確に処理するようにアプリケーションを設計する
このトピックでは、Amazon EC2 Auto Scaling グループが、まだ終了する準備ができていない Amazon EC2 インスタンスを終了できないようにするために使用できる機能について説明します。デフォルトでは、Auto Scaling はインスタンスで実行されているアプリケーションを表示できません。アプリケーションが割り当てられたジョブを適切にシャットダウンまたは完了する前に、インスタンスを終了できます。これらの機能により、アプリケーションはインスタンスの終了前に進行中の作業、転送状態、またはクリーンアップを実行する時間を確保できます。アプリケーションの要件に応じて、個別または組み合わせて使用できます。
これらの機能は、フリート内の各インスタンスが他のインスタンスとは異なるデータ、ジョブ、または状態を保持するステートフルワークロードに特に役立ちます。正常なシャットダウンなしでステートフルインスタンスを終了すると、長時間実行されるジョブが最初から再開され、データの冗長性やデータ損失が減少し、進行中のトランザクションや計算が中断される可能性があります。ステートフルインスタンスを適切にシャットダウンするには、ワークロードをドレイン (現在割り当てられているすべてのジョブを完了する) するか、転送 (ジョブ、データ、または設定を別のアクティブなインスタンスに移動する) する必要があります。
終了ライフサイクルフック
終了ライフサイクルフックは、終了対象として既に選択されている Amazon EC2 インスタンスの存続期間を延長します。インスタンスに現在割り当てられている進行中の作業を完了したり、進行状況を保存して別のインスタンスに転送したりするための追加の時間を提供します。
多くのワークロードでは、終了ライフサイクルフックは、終了対象として選択されたインスタンスのアプリケーションを正常にシャットダウンするのに十分です。これはベストエフォートアプローチであり、終了ライフサイクルアクションが中止された場合に終了を防ぐために使用することはできません。ワークロードの終了ライフサイクルアクションの失敗に対する許容度が低い場合は、インスタンスを保持するように、終了ライフサイクルフックと組み合わせてインスタンスライフサイクルポリシーを設定します。
終了ライフサイクルフックを使用するには、インスタンスが終了対象として選択されているタイミングを知る必要があります。これを知るには 2 つの方法があります。
| オプション | 説明 | 最適なケース | ドキュメントへのリンク |
|---|---|---|---|
| インスタンス内 | インスタンスメタデータサービス (IMDS) は、インスタンスのステータスをインスタンスから直接ポーリングできる安全なエンドポイントです。メタデータが Terminated で返された場合、インスタンスの終了がスケジュールされています。 |
インスタンスを終了する前に、インスタンスに対してアクションを実行する必要があるアプリケーション。 | ターゲットライフサイクル状態を取得する |
| インスタンス外 | インスタンスが終了する際に、イベント通知が生成されます。Amazon EventBridge、Amazon SQS、Amazon SNS、または を使用してルールを作成し、これらのイベント AWS Lambda をキャプチャし、Lambda 関数を使用して などのレスポンスを呼び出すことができます。 | インスタンスの外部でアクションを実行する必要があるアプリケーション。 | 通知ターゲットを設定する |
ライフサイクルフックを使用するには、インスタンスの終了準備が完全に整うタイミングを知る必要もあります。Amazon EC2 Auto Scaling は、CompleteLifecycleAction API コールを受信するか、タイムアウトが経過するまで、インスタンスを終了しません。
デフォルトでは、インスタンスは終了ライフサイクルフックにより、引き続き 1 時間にわたって実行できます (ハートビートタイムアウト)。ライフサイクルアクションを完了するのに 1 時間では足りない場合は、デフォルトのタイムアウトを設定できます。ライフサイクルアクションが進行中の場合は、RecordLifecycleActionHeartbeat API コールを使用してタイムアウトを延長できます。
詳細については、「Amazon EC2 Auto Scaling のライフサイクルフック」を参照してください。
インスタンスのスケールイン保護
インスタンスのスケールイン保護を使用して、スケールインイベント中に終了するインスタンスを制御できます。特に、長時間実行されるジョブをアクティブに処理しているインスタンスが終了しないようにできます。たとえば、コンテナ化されたワークロードを実行する場合、すべてのインスタンスを保護し、現在またはスケジュールされたタスクがないインスタンスに対してのみ保護を削除することをお勧めします。インスタンスは、新しいジョブのポーリングを継続し、新しいジョブが割り当てられると保護を再度有効にできます。
Auto Scaling グループレベルとインスタンスレベルでスケールイン保護を有効にできます。Auto Scaling グループレベルでスケールイン保護を有効にすると、新しいインスタンスのみが作成時に保護されます。既存のインスタンスでは、保護を個別に有効にできます。
アプリケーションは、インスタンス自体、または各インスタンスを終了可能かどうかを管理する一元的なコントロールプレーンから保護を設定できます。 SetInstanceProtection へのバッチ呼び出しが可能になり、API スロットリングの問題を回避できるため、大規模なフリートや保護を頻繁に切り替える必要がある場合は、一元化されたアプローチをお勧めします。
詳細については、「インスタンスのスケールイン保護を使用してインスタンスの終了を制御する」を参照してください。
カスタム終了ポリシー
インスタンスのスケールイン保護と同様に、カスタム終了ポリシーは、Amazon EC2 Auto Scaling グループが特定の EC2 インスタンスを終了しないようにするのに役立ちます。異常なインスタンスは、カスタム終了ポリシーに関係なく終了できます。
Auto Scaling グループは、デフォルトの終了ポリシーを使用して、最初に終了する Amazon EC2 インスタンスを決定します。どのインスタンスを最初に終了するかをより詳細に制御したい場合は、Lambda 関数を使用してカスタム終了ポリシーを実装できます。Auto Scaling は、終了するインスタンスを選択する必要があるたびにこの関数を呼び出し、関数が返すインスタンスのみを終了します。関数がエラー、タイムアウト、または空のリストを返した場合、インスタンスが異常でない限り、Auto Scaling はインスタンスを終了しません。
カスタム終了ポリシーは、アプリケーションがアイドル状態または安全に終了できるインスタンスを特定できる場合に役立ちます。これには通常、グループ全体のワークロードを追跡するコントロールプレーンが必要です。
詳細については、「Lambda を使用したカスタム終了ポリシーを作成する」を参照してください。
インスタンスライフサイクルポリシー
インスタンスライフサイクルポリシーは、終了ライフサイクルアクションが中止されたときの Amazon EC2 Auto Scaling の終了に対する保護を提供します。ライフサイクルフックのみとは異なり、インスタンスライフサイクルポリシーは、正常なシャットダウン手順が正常に完了しなかった場合にインスタンスが保持状態に移行するように設計されています。
Auto Scaling が終了するインスタンスを選択すると、設定された終了ライフサイクルフックが呼び出され、アプリケーションは正常なシャットダウン手順を開始します。終了ライフサイクルアクションが で正常に完了するとCONTINUE、インスタンスは正常に終了します。ただし、何らかの理由で終了ライフサイクルアクションが中止された場合、インスタンスライフサイクルポリシーはインスタンスを終了せずに保持状態に移行します。保持されたインスタンスは Auto Scaling グループの希望する容量にはカウントされないため、代替インスタンスは自動的に起動されます。 TerminateInstanceInAutoScalingGroup API を使用して保持されたインスタンスを手動で終了するまで、保持されたインスタンスとその置き換えの両方に対して標準の Amazon EC2 料金が発生します。
この機能を使用するには、TerminateHookAbandon保持トリガーを に設定してインスタンスライフサイクルポリシーとretain、少なくとも 1 つの終了ライフサイクルフックの両方を設定する必要があります。保持されたインスタンスには継続的な Amazon EC2 コストが発生し、手動アクションが必要なため、モニタリングは重要です。などの CloudWatch メトリクスを有効にGroupTerminatingRetainedInstancesし、インスタンスが保持状態になったときに警告する CloudWatch アラームを作成する必要があります。
詳細については、「インスタンスライフサイクルポリシーを使用してインスタンスの保持を制御する」を参照してください。
終了を完全に停止する
Amazon EC2 Auto Scaling グループ内のすべての EC2 インスタンス終了を完全に制御する必要がある場合は、Terminateプロセスを中断します。 Amazon EC2 上記のオプションでサービスに必要なコントロールが提供されていない場合にのみ、このオプションを使用することをお勧めします。 SuspendProcesses を呼び出してTerminateプロセスを停止することで、Auto Scaling が何らかの理由で終了を試みるのを防ぐことができます。ただし、TerminateInstanceInAutoScalingGroup API へのユーザーリクエストによって開始されたものは除きます。
詳細については、「Amazon EC2 Auto Scaling プロセスの中断と再開」を参照してください。
制限事項
重要
インスタンスの終了を適切に処理するように Amazon EC2 Auto Scaling でアプリケーションを設計する場合は、次の制限事項に注意してください。
異常なインスタンスが一部の保護をバイパスする
インスタンスに異常がある場合、カスタム終了ポリシーまたはスケールイン保護が設定されていても、Amazon EC2 Auto Scaling はインスタンスの終了を開始します。Auto Scaling による異常なインスタンスの置き換えを防ぐ唯一の方法はHealthCheck、、ReplaceUnhealthy、または Terminateプロセスを停止することです。ライフサイクルフックとインスタンスライフサイクルポリシーを使用して、アプリケーションが正常にシャットダウンしたり、異常なインスタンスが終了する前に復旧する必要があるデータをコピーしたりできます。
| 機能 | 正常なインスタンスを制御する | 異常なインスタンスを制御する |
|---|---|---|
| カスタム終了ポリシー | ||
| スケールイン保護 | ||
HealthCheck、ReplaceUnhealthy、または Terminateプロセスの停止 |
||
| ライフサイクルフック | ||
| インスタンスライフサイクルポリシー |
ライフサイクルフックだけでは、正常なシャットダウンは保証されません
デフォルトでは、終了ライフサイクルフックはベストエフォートベースで動作します。終了ライフサイクルアクションが中止された場合、Amazon EC2 Auto Scaling はインスタンスの即時終了に進みます。終了ライフサイクルフックをインスタンスライフサイクルポリシーと組み合わせて、終了ライフサイクルアクションが中止されたときにインスタンスを保持できます。この組み合わせでは、次のようになります。
-
Auto Scaling がインスタンスの終了をトリガーし、設定された Elastic Load Balancing ロードバランサーからのドレインが完了した後、終了ライフサイクルフックはアプリケーションを適切にシャットダウンしようとします。
-
何らかの理由で終了ライフサイクルアクションが中止された場合、インスタンスは終了ではなく保持状態に移行します。
-
保持されたインスタンスは現在の Amazon EC2 状態のままであるため、シャットダウン手順を手動で完了したり、障害を調査したりできます。
-
保持されているインスタンスを手動で終了するには、必要なアクションを完了した後に TerminateInstanceInAutoScalingGroup API を呼び出します。
詳細については、「インスタンスライフサイクルポリシーを使用してインスタンスの保持を制御する」を参照してください。
特定のインスタンス市場オプションは、制限付き通知で中断できます
Auto Scaling グループでスポットインスタンスや割り込み可能キャパシティ予約などのインスタンス市場オプションを使用する場合、Amazon EC2 はいつでもインスタンスを中断して再利用できます。これらの中断は、以下を含むすべての Amazon EC2 Auto Scaling 保護メカニズムをバイパスします。
-
終了ライフサイクルフック
-
インスタンスのスケールイン保護
-
カスタム終了ポリシー
-
インスタンスライフサイクルポリシー
-
停止されたプロセス
スポットインスタンスが中断通知を受け取ると、正常なシャットダウンタスクを実行するのに約 2 分かかります。終了ライフサイクルフックを使用してスポットインスタンスの中断に応答できますが、ライフサイクルフックがまだ進行中であっても、インスタンスは 2 分間の時間枠の終了時に強制的に終了します。インスタンスライフサイクルポリシーでも、スポットインスタンスの中断を防ぐことはできません。
スポットインスタンスの中断の処理の詳細については、「Amazon EC2 ユーザーガイド」の「スポットインスタンスの中断」と「Amazon EC2 スポットのベストプラクティス」を参照してください。 Amazon EC2 Amazon EC2
Amazon EC2 の直接終了はすべての保護をバイパスします
Amazon EC2 TerminateInstances API を使用して Auto Scaling グループのインスタンスを直接終了すると、終了によってすべての Amazon EC2 Auto Scaling 保護メカニズムがバイパスされます。
設定した保護を尊重しながら Auto Scaling グループのインスタンスを終了するには、代わりに TerminateInstanceInAutoScalingGroup API を使用します。
シナリオ例
Amazon EC2 Auto Scaling を使用すると、Auto Scaling がユーザーに代わって処理するフリート管理の量と、EC2 インスタンスの終了決定に対して保持する直接制御の量を選択できます。ワークロードがインスタンスの終了よりも機密性が高いほど、保持するコントロールはより大きくなります。次の例では、許容レベルと推奨設定が異なるワークロードについて説明します。
例 1: 分散データベースノード (低許容値)
各 EC2 インスタンスがレプリケーション係数 3 でデータのパーティションを保持する分散データベースを実行します。同じパーティションのレプリカを保持する複数のインスタンスを紛失すると、データが失われたり、そのパーティションが使用できなくなる可能性があります。
課題: Auto Scaling は、データが他のノードに再レプリケートされるよりも速くインスタンスを終了し、終了によってレプリケーション係数を維持するために必要な容量を下回る可能性があります。
次の設定を検討してください。
-
すべてのデータベースインスタンスでインスタンスのスケールイン保護を有効にします。データが他の場所で安全にレプリケートされたことを確認した後にのみ、プログラムで削除します。
-
延長タイムアウトで終了ライフサイクルフックをインスタンスライフサイクルポリシーと組み合わせて設定し、データ転送を完了できるようにします。
-
インスタンスメンテナンスポリシーを最小正常率 100% に設定して、必要な容量を維持します。
例 2: 長時間実行されるジョブ処理 (中耐性)
長時間実行されるジョブの受信メッセージを収集する Amazon SQS キューがあります。新しいメッセージが到着すると、EC2 インスタンスはメッセージを取得し、処理に 3 時間かかるジョブを開始します。キューが大きくなると、Auto Scaling はスケーリングポリシーに基づいてインスタンスを追加します。キューが縮小すると、Auto Scaling はインスタンスを終了します。
課題: Auto Scaling は、アイドル状態のインスタンスではなくジョブの処理から 3 時間経過したインスタンスを終了する場合があります。ジョブは別のインスタンスで再起動できますが、大幅な進行が失われます。
次の設定を検討してください。
-
アイドル状態のインスタンスを最初に終了することを優先するカスタム終了ポリシーを設定します。
-
終了ライフサイクルフックを使用して、進行中のジョブを完了できるようにします。
-
インスタンスがジョブを開始したときに、プログラムでインスタンスのスケールイン保護を有効にし、ジョブの完了時に削除します。
例 3: テスト環境のワーカーフリート (高耐性)
自動テスト、CI/CD パイプラインジョブ、または開発ワークロードを実行する EC2 インスタンスのフリートを実行します。これらのワーカーインスタンスはキューからタスクをプルし、ジョブが失敗した場合にテスト結果を再生成できます。
課題: スケールインイベント中にテストジョブが中断される可能性がありますが、テストは影響なく再試行できるため、中断のない可用性ではなくコストとシンプルさを最適化する必要があります。
次の設定を検討してください。
-
終了ライフサイクルフックを使用して、処理中のリクエストを完了できるようにします。
-
コストをさらに削減するために、容量最適化配分戦略でスポットインスタンスを使用することを検討してください。