ある企業がApplication Load Balancer(ALB)とAuto Scalingグループ(ASG)を組み合わせたWebアプリケーションを運用しています。一部のAPIリクエストのレスポンスには最大45秒かかります。スケールイン時に、ALBがEC2インスタンスをターゲットグループから登録解除するタイミングで処理中のリクエストが強制切断され、ユーザーにエラーが返ることがあります。アプリケーションコードの変更を最小限にして、スケールイン時のリクエスト切断を防ぐ設定の組み合わせはどれか。
スケールイン時のリクエスト切断を防ぐには2つの設定を組み合わせる必要があります。 ①ALBターゲットグループのderegistration delayを最長レスポンス時間(45秒)以上(例:60秒)に設定すると、ALBは対象インスタンスへの新規ルーティングを停止しつつ、既存の処理中リクエストが完了するまで最大60秒間待機します。 ②ただし、ASGのデフォルト動作ではALBのドレイン完了を待たずにインスタンスをTerminatingにすることがあるため、ASGのlifecycle hookでTerminating:Wait状態を追加し、ドレイン完了後にcomplete-lifecycle-actionを送信してインスタンス終了を制御します。 この2つの組み合わせにより、処理中リクエストを切断せずにスケールインを安全に完了できます。 選択肢AのALBアイドルタイムアウト延長はderegistration delayとは別設定であり、ASGがALBドレイン完了前にインスタンスを強制終了する競合状態は解消されません。 選択肢Bのスケールインクールダウンは次のスケールインアクション発動を遅延させるものであり、現在終了中のインスタンスの処理中リクエスト保護には無効です。 選択肢DのNLBへの切り替えはALBが提供するパスベースルーティングやヘッダー操作などの機能を失う可能性があり、大きなアーキテクチャ変更が必要で要件に反します。