ロードバランサーって触ってると楽しいじゃないですか。
AWS で最近発表された新機能を見ていたらそんなロードバランサー関連のものがあって面白いと思ったので、ブログにします。
Application Load Balancer Automatic Target Weights とは
Application Load Balancer automatic target weights は、AWS の ALB(Application Load Balancer)に追加されたロードバランサーがロードバランシングするときに使われる機能です。
ロードバランサーがロードバランシングするときってターゲット・・・ロードバランシングしてリクエストを流す先を1つかそれ以上用意して、特定のルールに従って流し先を決めるじゃないですか。
流し先が 1 個だけならともかく、複数あったらどれに流すか決めなければならなくなります。
その時、例えばリクエストを流す先のアプリケーションがエラーを起こして停止していたりしたら、そこにリクエストを流してもエラーが返ってくるからそちらに流したくないですよね。
そういうときのため、普段はその流し先がエラーを起こして停止していないかを知るためにロードバランサーからヘルスチェックのリクエストを定期的に送っています。
正常なレスポンスが返ってきたらそちらにリクエストを流し、逆にエラーが返ってくるようならそのターゲットはエラーを起こしているのでリクエストは流さないようにする・・・なんて仕組みをロードバランサーに設定します。
ただ、ヘルスチェックのリクエストは通るけど特定のリクエストがエラーになることってあるじゃないですか。
例えば特定のエンドポイントに投げられたリクエストだけがエラーを返したり、あるいはほとんどのエンドポイントがエラーを返すけれどもヘルスチェックにだけは常に正常なレスポンスを返したりとか。
ヘルスチェックをベースにしたロードバランシングだと、そのような状態でもターゲットは正常であるとして、他のターゲットと同じようにリクエストを流します。
困りますよね。
Automatic Target Weights という機能はそんな課題を解決してくれます。
この機能では、ロードバランサーが後ろでこれまで送られたリクエストに対してターゲットから帰っていくレスポンスを監視し、500 系の HTTP レスポンスが返っている件数が増えてきたらヘルスチェックでは正常に見えるターゲットでも、比率としてそのターゲットに流すリクエストの数を減らしていくようにします。
そうすることで、一部のターゲットの一部のリクエストだけがエラーを返すような謎な状態でもより多くのリクエストが正常に処理されるようになるのですね。
そんな、ヘルスチェックだけでは検知しきれないエラーにも反応してエラーレスポンスを減らしてくれる ALB の新しい機能が Automatic Target Weight という機能になります。
どうやって使うの
Automatic Target Weight は、確認したところ既にどのリージョンでも使えるようになっているようです。
既に作成されているロードバランサーのリソースから設定できます。
リソースを開いたらまずは「属性」のタブを開きます。
ロードバランサーのリソースのビューの上にも Automatic Target Weights の情報が表示されていますね。
属性タブを開いたら、右上の「編集」ボタンを押します。
トラフィックの設定で、ロードバランシングアルゴリズムを「加重ランダム」に変更します。
すると出てくる「異常緩和をオンにする」にチェックします。
そして、この状態で更新します。
これで設定完了です。
ロードバランサーのターゲットタブに既にありましたが、異常検出のカラムがあります。現在は Normal ですが、異常レスポンスが増えてきた場合ココが変わるようです。(まだ変わったところは見たことないです)
これによってどのターゲットが異常か分かり、また、そちらへのリクエストはあまり流さないようになります。
おわりに
ヘルスチェック自体は通るけれどもエラーのレスポンスが返る状態を英語で Gray Failure
と呼ぶそうです。
原因としてはアプリケーションのバグやターゲットがさらに接続している別のリソースのエラー、キャッシュが温まっていないなど様々なものがあるようです。
Automatic Target Weights はそのような問題に対して有効みたいですね。
設定方法も簡単で追加料金もかからず、これまでどおりヘルスチェックは行って正常とされるターゲットから流し先を決めてくれるため、これから先特に理由がなければ ALB を作る際はこの設定にしてもいいような気さえします。
PS: この記事は本当はAWS re:Invent 2023で新登場した機能の記事として書こうとしていたのですが、よく見たらこの機能はAWS re:Invent 2023の開催日に公開された機能であってre:Inventとは関係ありませんでした。許して。