はじめに

今回発生していた事象にも記載の通り、利用しているALBで「HTTPCode_Target_5XX_Count」のメトリクスを検知していました。
今まではターゲットに原因があったので、今回もターゲットに原因があると思い込み調査をしていました。
「HTTPCode_Target_5XX_Count」で悩んでいる方のお役に立てれば幸いです。

ALBのメトリクス「HTTPCode_ELB_5XX_Count」、「HTTPCode_Target_5XX_Count」について

ALBの5XX_Countメトリクスは2種類あります。
以下に公式ドキュメントの内容を記載しますが、5XXエラーがロードバランサーから検知するのか、ターゲットから検知するのかの違いになります。[1]

メトリクス名 内容
HTTPCode_ELB_5XX_Count ロードバランサーから送信される HTTP 5XX サーバーエラーコードの数。この数には、ターゲットによって生成される応答コードは含まれません。
HTTPCode_Target_5XX_Count ターゲットによって生成された HTTP 応答コードの数。これには、ロードバランサーによって生成される応答コードは含まれません。

今回発生していた事象

利用しているALBで「HTTPCode_Target_5XX_Count」のメトリクスを検知していたため、ターゲットに原因がないか調査を実施していました。
しかしながら、ターゲットから原因を特定することができず、継続して「HTTPCode_Target_5XX_Count」のメトリクスを検知していました。

結論

公式ドキュメントに以下記載があり、CloudTrailを確認したところドキュメント記載の内容と同じ状況でした。[2]

CloudTrail イベントで、問題の期間中に DeregisterTargets アクションを含む API コールを確認します。問題の期間中に DeregisterTargets を使用した API コールが発生した場合、このエラーは早期に登録解除されたターゲットが原因です。
この問題を解決するには、登録解除の遅延時間を長くして、長時間のオペレーションが失敗することなく完了できるようにします。

したがって、「DeregisterTargets」の値を変更することで「HTTPCode_Target_5XX_Count」のメトリクスは検知しなくなりました。

「DeregisterTargets」について

「DeregisterTargets」の内容は公式ドキュメントを確認していただければと思います。[3]
注意点としてはターゲットがAuto Scaling グループの場合、Health statusが「unused」にならないとインスタンスが置き換わらないです。
「DeregisterTargets」で設定した値を経過しないと、Health statusは「unused」にならないので、「DeregisterTargets」の値は適切な値に調整する必要があるかと思います。

参考記事

[1]:Application Load Balancer のメトリック
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-cloudwatch-metrics.html#load-balancer-metric-dimensions-alb
[2]:登録解除されたターゲットによって処理されたリクエストについて、登録解除の遅延期間が経過した
https://aws.amazon.com/jp/premiumsupport/knowledge-center/elb-alb-troubleshoot-502-errors/
[3]:登録解除の遅延
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-target-groups.html#deregistration-delay

まとめ

ルーティン化している調査でも詰まったときには、別の視点から調査する必要性を実感しました。