ALBはただのロードバランサーにあらず:L7で制御する「賢いトラフィック制御」の深淵
こんにちは。現場で夜通しパケットキャプチャを眺めながら、ネットワークの深淵と戦っているエンジニアです。
今日は、AWSのインフラ設計における「必須科目」でありながら、意外とブラックボックスになりがちな Application Load Balancer (ALB) について掘り下げていきます。単に「リクエストを振り分ける箱」として使っていませんか? ALBの本質は、OSI参照モデルのレイヤー7(アプリケーション層)でHTTP/HTTPSを解釈し、インテリジェントに交通整理を行う「プロキシ」であるという点にあります。
この仕組みを理解しているか否かで、障害発生時の切り分けスピードが天と地ほど変わります。
—
1. ALBの「脳内」:L7インスペクションの仕組み
ALBは、クライアントからのTCPコネクションを一度終端(Termination)します。つまり、ALBはクライアントと「握手」をした後、内部的にバックエンドのターゲット(EC2やFargateなど)と別のTCPコネクションを張り直す構造です。
この「終端」こそが、ALBがただのL4(NLBなど)と一線を画すポイントです。一度HTTPリクエストをバッファリングし、中身を解釈できるからこそ、以下の処理が可能になります。
- Hostベースルーティング:
api.example.comとweb.example.comを同じALBで受け分ける。 - Pathベースルーティング:
/api/v1/はマイクロサービスAへ、/images/はS3経由で配信するなど。 - HTTPヘッダー操作:
X-Forwarded-Forの付与や、X-Amzn-Trace-Idによるトレース。
—
2. 実務で直面するHTTP通信フロー
私たちが何気なく叩く curl コマンドの裏側では、ALBが高度な判断を下しています。
# 現場でよく使う、ALB経由のトレース確認コマンド
curl -v -H "Host: api.example.com" https://my-alb-12345.ap-northeast-1.elb.amazonaws.com/api/v1/users
このコマンドを打った瞬間、ALBの内部では以下のシーケンスが走っています。
1. クライアント → ALB: TLSハンドシェイクが完了。HTTP GETリクエストがALBに届く。
2. ALBのリスナールール評価: 設定された「優先順位」に基づき、リクエストを解析。Host ヘッダーが api.example.com かつパスが /api/v1/ であることを確認。
3. ターゲットグループへの転送: 紐付いたターゲットグループ(TG)の健全なインスタンスをアルゴリズム(Round Robin等)で選出。
4. ALB → ターゲット: X-Forwarded-For 等のヘッダーを付与してリクエストを転送。
—
3. 設定の肝:リスナールールの優先順位と「デフォルトルール」
ALBの運用で最も多いミスが「ルールの優先順位設定」です。ALBのルールは上から順に評価され、マッチした瞬間に処理を確定します。
よくある構成例(Terraform/AWS CLI想定)
もし /api/v1/ へのルーティング設定を、デフォルトルール(全てのパスを拾うルール)よりも下に書いてしまうと、永遠に意図したターゲットに届きません。
# ルール優先順位の考え方
resource "aws_lb_listener_rule" "api_rule" {
listener_arn = aws_lb_listener.front_end.arn
priority = 10 # 数字が小さいほど優先される
action {
type = "forward"
target_group_arn = aws_lb_target_group.api_tg.arn
}
condition {
path_pattern {
values = ["/api/*"]
}
}
}
—
4. 現場の教訓:ALBトラブルシューティングの極意
「ALBが503を返しているが、バックエンドは生きているように見える」といった相談をよく受けます。そんな時は、迷わず以下の点を確認してください。
- ターゲットグループのヘルスチェック:
HTTP 200 OK以外のコードを返していないか? - Tips: ヘルスチェックのパスは、単なる
/ではなく、DB接続チェックを含まない「軽量な疎通確認エンドポイント」を専用に用意するのが鉄則です。 - セキュリティグループ(SG)の穴: ALBからターゲットへの通信(ポート80/8080等)がSGで許可されているか? 意外と忘れがちですが、ALBのIDを参照するSGルールにするのがベストプラクティスです。
- クライアントのタイムアウト: ALBはデフォルトで60秒のアイドルタイムアウトを設定しています。Web APIで重いバッチ処理を叩く場合、
504 Gateway Timeoutが出ることがあります。その際はターゲット側ではなく、ALBの設定変更が必要です。
Pythonによるレスポンスヘッダー確認(デバッグ用)
ALBが正しくリクエストを処理しているか、HTTPレスポンスを確認する小さなスクリプトです。
import requests
# ALBのURL
url = "https://my-alb-12345.ap-northeast-1.elb.amazonaws.com/api/health"
try:
response = requests.get(url, timeout=5)
# X-Amzn-Trace-Id を確認することで、ALBのどのノードを通ったか追跡可能
print(f"Status: {response.status_code}")
print(f"Trace ID: {response.headers.get('X-Amzn-Trace-Id')}")
except requests.exceptions.RequestException as e:
print(f"通信エラー: {e}")
—
最後に:ALBを「ただの通過点」にしないために
ALBは単なるL7スイッチではありません。WAF(Web Application Firewall)を統合すればセキュリティの要になりますし、リクエストの正規化を行うことで、バックエンドのアプリケーションコードをクリーンに保つ役割も担います。
「なぜこのリクエストがここに飛ぶのか?」をパケット単位で想像できるようになれば、あなたはもう一人前のインフラエンジニアです。現場で困ったときは、まずはALBの Access Log を眺めてみてください。そこに、全ての真実が記録されています。
次回は、より高トラフィックを捌くための「NLBとALBの使い分け(ハイブリッド構成)」について深掘りしましょう。それでは、良いクラウドライフを!
コメント