Amazon ECS のロードバランサー Connection Draining パラメータを最適化する
最適化を可能にするために、クライアントはコンテナサービスへのキープアライブ接続を維持します。これにより、そのクライアントからの後続のリクエストが既存の接続を再利用できるようにします。コンテナへのトラフィックを停止したいときは、ロードバランサーに通知します。ロードバランサーはクライアントがキープアライブ接続を閉じたかどうかを定期的に確認します。Amazon ECS エージェントはロードバランサーを監視し、キープアライブ接続が閉じられた (ターゲットが UNUSED
の状態にある) ことをロードバランサーが報告するのを待ちます。
ロードバランサーがターゲットを UNUSED
状態へと移行するまで待機する時間の長さが登録解除の遅延です。以下のロードバランサーパラメータを設定して、デプロイをスピードアップできます。
-
deregistration_delay.timeout_seconds
: 300 (デフォルト)
レスポンス時間が 1 秒未満のサービスの場合は、パラメータを次の値に設定して、クライアントとバックエンドサービスとの間の接続を切断するまでロードバランサーが 5 秒だけ待機するようにします。
-
deregistration_delay.timeout_seconds
: 5
注記
ファイルのアップロードやストリーミング接続が遅いなど、リクエストの有効期間が長いサービスの場合は、この値を 5 秒に設定しないでください。
SIGTERM 応答性
Amazon ECS は、まず SIGTERM シグナルをそのタスクに送信し、アプリケーションを終了してシャットダウンする必要があることを通知します。次に、Amazon ECS は SIGKILL メッセージを送信します。アプリケーションが SIGTERM を無視する場合、Amazon ECS サービスはプロセスを終了する SIGKILL シグナルの送信を待つ必要があります。
Amazon ECS が SIGKILL メッセージの送信を待つ時間は、次の Amazon ECS エージェントオプションによって決まります。
-
ECS_CONTAINER_STOP_TIMEOUT
: 30 (デフォルト)コンテナエージェントパラメータの詳細については、GitHub の「Amazon ECS コンテナエージェント
」を参照してください。
待機時間を短縮するには、Amazon ECS エージェントパラメータを次の値に設定します。
-
ECS_CONTAINER_STOP_TIMEOUT
: 2アプリケーションに 1 秒以上かかる場合は、値に 2 を掛けて、その数値を値として使用します。
この場合、Amazon ECS はコンテナがシャットダウンされるまで 2 秒間待機し、アプリケーションが停止しなかったときに Amazon ECS は SIGKILL メッセージを送信します。
SIGTERM シグナルをトラップして反応するようにアプリケーションコードを変更することもできます。JavaScript の例を次に示します。
process.on('SIGTERM', function() { server.close(); })
このコードにより、HTTP サーバーは新しいリクエストのリッスンを停止し、処理中のリクエストへの応答を終了します。イベントループは何も行わないため Node.js プロセスが終了します。これを考慮すると、プロセスが実行中のリクエストを完了するのに 500 ミリ秒しかかからない場合、プロセスは停止タイムアウトを待って SIGKILL を送信する必要がなく、早期に終了します。