0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ALBの仕組みを「なんとなく」で3年過ごしてきたエンジニアが整理したこと

0
Posted at

はじめに

「ALBの前にEC2が2台あって、トラフィックを分散してくれる」——これが3年間の私のALB理解でした。

使えていました。設定もできていた。でも「ヘルスチェックの仕組みを説明してください」「スティッキーセッションとは何ですか?」と聞かれると答えられなかった。

ある障害対応で「ALBのターゲットが全部unhealthyになっています」という状況になったとき、「unhealthyって何が起きているのか」を正確に説明できなかったことが、理解を深めるきっかけになりました。

この記事は、ALBの構成要素を「なんとなく」から「説明できる」レベルに整理したものです。

この記事を読むと、以下のことができるようになります。

  • ALBの構成要素(リスナー・ルール・ターゲットグループ)の役割が理解できる
  • ヘルスチェックの仕組みと、unhealthyになる原因の切り分けができる
  • スティッキーセッションやパスベースルーティングの使い所が分かる

ALBの全体構造

ALB(Application Load Balancer)は、受け取ったリクエストを複数のバックエンドサーバーに振り分けるサービスです。
Gemini_Generated_Image_y6usr2y6usr2y6us.png

ALBは3つの要素で構成されます。

要素 役割
リスナー どのポート・プロトコルで待ち受けるかを定義
ルール リクエストの条件(パス・ヘッダーなど)に応じて転送先を決定
ターゲットグループ 実際にリクエストを受け取るEC2・Lambdaなどのグループ

リスナーとルールの仕組み

リスナーは「このポートで受け付けます」という定義です。HTTP(80番)やHTTPS(443番)でリスナーを作ります。

ルールは「このリクエストはここへ転送する」という条件分岐です。

パスベースルーティングの例

条件: パスが /api/* にマッチする → ターゲットグループ: TG-API へ転送
条件: パスが /admin/* にマッチする → ターゲットグループ: TG-Admin へ転送
デフォルト: → ターゲットグループ: TG-Web へ転送

1台のALBで複数のアプリケーションへのルーティングができます。以前は「アプリごとにALBを立てる」という運用を見たことがありますが、パスベースルーティングを使えば1台に集約できます。

ホストベースルーティングの例

条件: ホストヘッダーが api.example.com → TG-API へ転送
条件: ホストヘッダーが www.example.com → TG-Web へ転送

ドメインによって転送先を変えることもできます。


ターゲットグループとヘルスチェック

ターゲットグループは「リクエストを送る先のサーバー一覧+ヘルスチェック設定」のセットです。

ヘルスチェックとは

ALBはターゲットグループ内のサーバーに対して、定期的にHTTPリクエストを送って「このサーバーは正常に動作しているか」を確認します。これがヘルスチェックです。

ヘルスチェックの設定例:
- プロトコル: HTTP
- パス: /health
- ポート: traffic port(リクエストと同じポート)
- 正常のしきい値: 3回連続成功でhealthy
- 非正常のしきい値: 2回連続失敗でunhealthy
- タイムアウト: 5秒
- 間隔: 30秒

/health というパスにアクセスして、HTTPステータス200が返ってきたらhealthy、返ってこなかったり200以外が返ったらunhealthyと判断します。

unhealthyになる原因

「ALBのターゲットがunhealthyになった」というアラートを受けたとき、確認する順番です。

image.png

よくある原因は以下のとおりです。

  • アプリのプロセスが落ちている:EC2は起動しているがアプリが落ちている
  • セキュリティグループの設定ミス:ALBからのヘルスチェックポートが開いていない
  • ヘルスチェックパスが間違っている/health にアクセスしても404が返る
  • 起動直後のタイミング:デプロイ直後はアプリが起動中でヘルスチェックが失敗する(猶予期間設定が必要)

スティッキーセッションとは

「スティッキーセッション」を聞いて「何ですか?」となっていた言葉の一つです。

通常のロードバランシングでは、リクエストのたびに異なるターゲットに転送されます。複数台のサーバーにセッション情報が分散するため、セッション管理をサーバー側でしているアプリケーションでは問題が起きることがあります(ログイン状態が次のリクエストで消えるなど)。

スティッキーセッションを有効にすると、同じクライアントからのリクエストを常に同じターゲットに転送し続けます。Cookieを使って「このクライアントはこのサーバーへ」という紐付けを維持します。

ただし、スティッキーセッションは「スケールアウト(サーバーを増やす)の効果が薄れる」「特定のサーバーに負荷が偏る」というデメリットがあります。できればセッション情報をElastiCache(Redis)などに外出しして、どのサーバーが処理しても同じ結果になるアーキテクチャが望ましいです。


HTTPからHTTPSへのリダイレクト設定

ALBでHTTP(80番)へのアクセスをHTTPS(443番)にリダイレクトする設定は、実務でよく使います。

AWSコンソールで設定する場合:

  1. ロードバランサー → リスナー → HTTP:80 を選択
  2. ルールの編集 → デフォルトアクション:「リダイレクト先」を選択
  3. HTTPS / 443 / 301(恒久的リダイレクト)を設定
# CLIでHTTP→HTTPSリダイレクトのルールを確認
aws elbv2 describe-rules \
  --listener-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:listener/app/my-alb/xxx/yyy \
  --query 'Rules[*].[Priority,Actions[0].Type,Actions[0].RedirectConfig]' \
  --output table

まとめ

この記事では以下のことを解説しました。

  • ALBは「リスナー(待ち受けポート)」「ルール(転送条件)」「ターゲットグループ(転送先+ヘルスチェック)」の3要素で構成される
  • ヘルスチェックは定期的にHTTPリクエストを送って正常性を確認し、失敗が続くとunhealthyに変わる
  • unhealthyの主な原因はアプリプロセスの停止・SGの設定ミス・ヘルスチェックパスの誤り
  • パスベース・ホストベースのルーティングで1台のALBから複数のアプリへ振り分けられる
  • スティッキーセッションは便利だが、セッション管理の外出しができるなら使わない方がスケーラブル

「ALBの前にEC2が並んでいる」という理解から、「どういうルールでどこに転送しているか」が説明できるようになると、障害対応もトラブルシューティングもずっとスムーズになります。



ハンズオンラボでは、未経験からでも「作って覚える」をモットーにしたITハンズオンイベントを定期開催しています。

👉 イベント一覧はこちら

運営メンバーのXはこちら
えむ / わたる


面白かったら
「👇いいね」で応援

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?