ALBのAnomalousHostCountメトリクスはターゲットホストからの異常応答(HTTP 5XXなど)が他のターゲットよりも多い場合の対象ターゲット数を表しますが、AnomalousHostCountをトリガーにアラームを設定する場合などにそのテスト環境として役に立つかなと思うのでこのメトリクスを簡単に出す環境を作ってみます。

環境作成とテスト

ALBにぶら下げるターゲットはAWSがAnomalousHostを判断するために3台以上必要なので、まず以下のEC2インスタンスを3台作成します。

・Amazon Linux 2023 + nginx(インストールのみ)

次にこのうち1台だけnginxに流量制御を設定します。

$ sudo vi /etc/nginx/nginx.conf
:
http {
    limit_req_zone $binary_remote_addr zone=req:1m rate=1r/s;
    limit_req zone=req;
    :
}

$ sudo systemctl restart nginx

limit_req_zoneで流量制御のゾーン定義をし、limit_reqでそのゾーンを有効化します。

  • $binary_remote_addr
    • リモートアドレス毎にバッファを用意
  • zone=req:1m
    • バッファに「req」というゾーン名を付け、バッファ容量は1MBとする
  • rate=1r/s
    • 1秒間に1リクエストまでの受け入れを許可

その他パラメータの詳細は公式ドキュメントを参照して下さい。

Module ngx_http_limit_req_module

この状態でALBを作成して上記3台のEC2をぶら下げ、ヘルスチェックの失敗回数(非正常のしきい値)を2から10に増やしてターゲットホストがUnHealthyになる条件を緩めた上で外部から例えば0.2秒毎にリクエストを送るとAnomalousHostCountメトリクスが出ます。

$ while [ 1 ]
do
curl http://<ALB>のURL/
sleep 0.2
done

なお、流量制御を設定したnginxのログには以下のような内容が記録されます。

  • /var/log/nginx/access.log
xx.xx.xx.xx - - [DD/MMM/YYYY:hh:mm:ss +0900] "GET / HTTP/1.1" 503 3693 "-" "curl/x.x.x" "xx.xx.xx.xx"
  • /var/log/nginx/error.log
YYYY/MM/DD hh:mm:ss [error] 2187#2187: *1774 limiting requests, excess: 0.195 by zone "req", client: xx.xx.xx.xx, server: _, request: "GET / HTTP/1.1", host: "xxxxxxxx.ap-northeast-1.elb.amazonaws.com"

参考ドキュメント

Mod>Application Load Balancer のターゲットグループ > 自動ターゲット重み (ATW) – Amazon Web Services