draining状態が長くてターゲットの切り離しに時間がかかる…
なんとかならないかなぁ。
このような疑問にお答えします。
- AWS
- EC2
- ELB or ALB
冗長構成にしている場合、デプロイする際には片方のインスタンスを切り離した上でデプロイすると思います。
その切り離しを行う際にかなり時間がかかってしまうことがありました。
時間がかかってしまうと1つのインスタンスでリクエストを処理する時間が長くなってしまいます。
この問題を解決したいと思います。
原因:初期設定では切り離しまで300秒になっている
ターゲットグループに登録解除の遅延という設定項目があります。
ターゲットの登録解除中に未処理のリクエストが完了するまで待つ時間。この時間中、ターゲットの状態はストリーミングになります。
この項目が悪さをしていました。

インスタンス切り離し後、ここで設定した時間だけターゲットはdraining状態になります。
初期設定では300秒となっています。
つまり切り離してから300秒間は未処理のリクエストが完了するまで待機します。
300秒って結構余裕がありますよね。
そのため、この時間を調整する必要がありました。
解決:登録解除の遅延を60秒に設定!
こちらの設定はターゲットグループ(EC2 > ロードバランシング > ターゲットグループ)に対して行います。
設定するターゲットグループを選択すると、「説明」の下のほうに「属性」という項目があります。
属性の編集から登録解除の遅延を60秒に設定しました。
規模にも寄りますが60秒でも少し余裕があると思います。

これでデプロイ時間が短縮できるようになると思います。
あとがき
長いと感じながらも待てば良いだけなので、なかなか気づかない項目かもしれません。
インフラの規模や負荷状況に応じて変更する必要はあると思います。
リクエストをすべて処理してからデプロイできるように調整してみてください!