「設定の違いは分かるけど、本番でどう使い分けるのか判断できない」
AWSには複数種類のロードバランサーがあり、構成設計の段階で選択を誤るとパフォーマンス問題やセキュリティリスク、余計なコストにつながります。特にマルチAZ冗長構成を前提にした設計では、レイヤーごとの特性を理解した上でロードバランサーを選ぶことが、システムの安定稼働に直結します。
この記事では、Application Load Balancer(ALB)とNetwork Load Balancer(NLB)の設計上の違いと使い分け基準を、
aws elbv2コマンドの実装例を交えて解説します。マルチAZ構成の設定方法、ヘルスチェック設計のベストプラクティス、503エラーなどトラブルシュートの切り分け手順まで実務視点でカバーします。この記事のポイント
・ALBはL7(HTTP/HTTPS)、NLBはL4(TCP/UDP)で動作する
・パスベースルーティング・WAF連携が必要ならALB一択
・固定IP・低レイテンシ・DB/MQ接続ならNLBが適切
・マルチAZ設定はaws elbv2コマンドで複数サブネットを指定する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
AWSのロードバランサーは3種類ある
AWSが提供するELB(Elastic Load Balancing)には、現在3種類のロードバランサーがあります。・ALB(Application Load Balancer):L7(アプリケーション層)で動作。HTTP/HTTPS/WebSocket/gRPCに対応
・NLB(Network Load Balancer):L4(トランスポート層)で動作。TCP/UDP/TLSに対応
・GLB(Gateway Load Balancer):L3(ネットワーク層)で動作。ファイアウォールやIDSなどのネットワークアプライアンスを挿入するための特殊用途
WebアプリケーションやAPIサーバーの設計で主に選択肢になるのはALBとNLBの2種類です。本記事もこの2つに絞って解説します。
AWSコンソールやCLIでロードバランサーを操作する際は、すべて
aws elbv2コマンドを使います(旧世代のClassic Load Balancerはaws elbコマンドですが、新規設計では利用しない方がよいです)。Application Load Balancer(ALB)の設計と適用場面
ALBはHTTPヘッダー・URLパス・ホスト名などのL7情報を見てルーティングを判断できます。Webアプリケーション、REST API、マイクロサービスの振り分けに最も多く使われるロードバランサーです。ALBが適する典型的な場面を挙げます。
・パスベースルーティング:
/api/*はAPIサーバーへ、/static/*はS3やCloudFrontへ振り分ける・ホストベースルーティング:
app.example.comとadmin.example.comを同一ALBで別々のターゲットへ振り分ける・SSL/TLS終端:ALBでHTTPS終端を行い、バックエンドEC2にはHTTPで転送する(証明書管理をACMに一元化できる)
・AWS WAF統合:WAFルールをALBに適用してSQLインジェクションやXSS攻撃をブロックする
・Amazon Cognito統合:ログインページへのリダイレクトやJWT検証をALBにオフロードする
1. ALBを作成してマルチAZに設定する
ALBのマルチAZ設定は、作成時に--subnetsオプションで複数のアベイラビリティゾーン(AZ)にある各サブネットを指定するだけで完了します。# ALBを作成(ap-northeast-1a / ap-northeast-1c のマルチAZ構成) # --subnets に異なるAZのサブネットIDを列挙する aws elbv2 create-load-balancer \ --name my-web-alb \ --type application \ --subnets subnet-aaa1b2c3 subnet-xxx4y5z6 \ --security-groups sg-0abcdef0123456789 \ --scheme internet-facing \ --ip-address-type ipv4 # 出力例(抜粋) # LoadBalancers: # - DNSName: my-web-alb-1234567890.ap-northeast-1.elb.amazonaws.com # State: # Code: active # AvailabilityZones: # - ZoneName: ap-northeast-1a # SubnetId: subnet-aaa1b2c3 # - ZoneName: ap-northeast-1c # SubnetId: subnet-xxx4y5z6
--security-groups)が必須です。通常、80/tcp(HTTP)と443/tcp(HTTPS)のインバウンドを許可するセキュリティグループを事前に作成しておきます。2. ターゲットグループとリスナーを設定する
ロードバランサー本体を作成した後、トラフィックの転送先となるターゲットグループと、受け付けるプロトコル・ポートを定義するリスナーを設定します。# ターゲットグループを作成(ヘルスチェックも同時に設定) aws elbv2 create-target-group \ --name my-web-tg \ --protocol HTTP \ --port 80 \ --vpc-id vpc-01234567abcdef890 \ --health-check-protocol HTTP \ --health-check-path /health \ --health-check-interval-seconds 30 \ --healthy-threshold-count 2 \ --unhealthy-threshold-count 3 \ --target-type instance # EC2インスタンスをターゲットグループに登録する aws elbv2 register-targets \ --target-group-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-web-tg/abcdef1234567890 \ --targets Id=i-0123456789abcdef0 Id=i-0abcdef1234567890 # HTTPSリスナーを作成(ACM証明書を使用) aws elbv2 create-listener \ --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/my-web-alb/abcdef1234567890 \ --protocol HTTPS \ --port 443 \ --certificates CertificateArn=arn:aws:acm:ap-northeast-1:123456789012:certificate/abcd1234-5678-90ab-cdef-example11111 \ --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-web-tg/abcdef1234567890
/health)を設けることを推奨します。ルートパス(/)をヘルスチェックに使うと、アプリの一部だけ壊れた場合に正常と誤判定するリスクがあります。Network Load Balancer(NLB)の設計と適用場面
NLBはL4で動作するため、HTTPの中身は関知せず、TCPコネクションをそのままターゲットに転送します。HTTPアプリには不向きに見えますが、以下の場面ではNLBが適切な選択になります。・固定IPが必要な場合:NLBにはEIP(Elastic IP)を割り当てられるため、IPホワイトリストで管理する外部システムとの連携が可能です
・DB・MQへのTCP接続を負荷分散したい場合:PostgreSQL(5432/tcp)やRabbitMQ(5672/tcp)など、HTTPではないプロトコルの負荷分散に使います
・クライアントIPをバックエンドで直接参照したい場合:NLBはX-Forwarded-Forヘッダーを付与しないため、ソースIPがそのまま届きます(ALBはXFFヘッダーで転送するためバックエンドには直接届かない)
・超低レイテンシが必要なケース:NLBはL4のパケット転送なのでALBより処理オーバーヘッドが少ない。ゲームサーバーやIoTデバイスの接続に向いています
1. NLBを作成してマルチAZに設定する
# NLBを作成(マルチAZ構成) aws elbv2 create-load-balancer \ --name my-app-nlb \ --type network \ --subnets subnet-aaa1b2c3 subnet-xxx4y5z6 \ --scheme internet-facing # TCPターゲットグループを作成(例:PostgreSQL 5432/tcp) aws elbv2 create-target-group \ --name my-db-tg \ --protocol TCP \ --port 5432 \ --vpc-id vpc-01234567abcdef890 \ --health-check-protocol TCP \ --health-check-interval-seconds 30 \ --healthy-threshold-count 2 \ --unhealthy-threshold-count 3 \ --target-type instance # TCPリスナーを作成 aws elbv2 create-listener \ --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/net/my-app-nlb/abcdef1234567890 \ --protocol TCP \ --port 5432 \ --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-db-tg/abcdef1234567890
2. NLBのゾーナルアイソレーションに注意する
NLBにはALBと異なる「ゾーナルアイソレーション(Zonal Isolation)」という特性があります。クライアントが特定のAZのNLBエンドポイントに接続した場合、そのAZのターゲットだけに転送されます。この挙動はクロスゾーン負荷分散(後述)を有効化することで変更できますが、有効化するとAZをまたぐデータ転送に追加料金が発生します。設計段階で意識しておくポイントです。
ロードバランサーとVPC設計を体系的に習得したい方は、AWSマスターセミナー上級編も合わせてご確認ください。現役エンジニアが設計判断の根拠も含めてハンズオンで解説しています。
ALBとNLBの選定基準まとめ
実務での選定は次の観点で判断します。| 比較項目 | ALB | NLB |
|---|---|---|
| 動作レイヤー | L7(HTTP/HTTPS) | L4(TCP/UDP/TLS) |
| 対応プロトコル | HTTP・HTTPS・WebSocket・gRPC | TCP・UDP・TLS |
| 固定IP | なし(DNS名のみ) | あり(EIP割り当て可) |
| パスベースルーティング | あり | なし |
| AWS WAF統合 | あり | なし |
| Cognito認証 | あり | なし |
| セキュリティグループ | 必須 | 不要 |
| クライアントIP保持 | X-Forwarded-Forヘッダーで取得 | ソースIPが直接届く |
| 主なユースケース | WebアプリAPI・マイクロサービス | DB・MQ・ゲーム・IoT |
ヘルスチェック設計のベストプラクティス
ロードバランサーが「このターゲットは生きているか」を判断するのがヘルスチェックです。設定が甘いと不正確な判定が起こり、障害時に正常サーバーへの切り替えが遅れます。1. ヘルスチェック間隔と閾値の設計
# 現在のターゲットグループのヘルスチェック設定を確認する aws elbv2 describe-target-groups \ --target-group-arns arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-web-tg/abcdef1234567890 # ヘルスチェック設定を変更する aws elbv2 modify-target-group \ --target-group-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-web-tg/abcdef1234567890 \ --health-check-interval-seconds 30 \ --healthy-threshold-count 2 \ --unhealthy-threshold-count 3 \ --health-check-timeout-seconds 5 # ターゲットの現在のヘルス状態を確認する aws elbv2 describe-target-health \ --target-group-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-web-tg/abcdef1234567890 # 出力例(正常) # TargetHealthDescriptions: # - Target: # Id: i-0123456789abcdef0 # Port: 80 # TargetHealth: # State: healthy # - Target: # Id: i-0abcdef1234567890 # Port: 80 # TargetHealth: # State: healthy
・interval(チェック間隔):30秒。5秒にすると障害検知は速くなるが、バックエンドへのリクエスト頻度が増す
・healthy_threshold:2回連続正常でHealthy判定。デフォルト5から下げると障害回復後の復帰が速くなる
・unhealthy_threshold:3回連続失敗でUnhealthy判定。2回だと一時的なレスポンス遅延でも外れてしまうリスクがある
・health-check-path:
/healthなどの専用エンドポイントを用意し、ステータスコード200を返すように実装する。DBへの疎通確認を含めると精度が上がるクロスゾーン負荷分散の設計と料金への影響
クロスゾーン負荷分散(Cross-Zone Load Balancing)は、リクエストをすべてのAZのターゲットに均等に分散する機能です。1. ALBとNLBの挙動の違い
ALBはデフォルトでクロスゾーン負荷分散が有効です(追加料金なし)。NLBはデフォルトで無効です(有効化するとAZをまたぐデータ転送に料金が発生します)。
# ロードバランサーのクロスゾーン設定を確認する aws elbv2 describe-load-balancer-attributes \ --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/net/my-app-nlb/abcdef1234567890 # 出力例(NLBのデフォルト) # Attributes: # - Key: load_balancing.cross_zone.enabled # Value: "false" # NLBのクロスゾーン負荷分散を有効化する aws elbv2 modify-load-balancer-attributes \ --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/net/my-app-nlb/abcdef1234567890 \ --attributes Key=load_balancing.cross_zone.enabled,Value=true
トラブルシュート|503・502・504エラーの切り分け手順
ロードバランサー経由でエラーが返る場合の切り分け手順をまとめます。1. 503 Service Unavailable の対処
利用可能なターゲットが1台もない状態です。すべてのEC2がUnhealthyになっている可能性があります。# ターゲットのヘルス状態を確認する aws elbv2 describe-target-health \ --target-group-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-web-tg/abcdef1234567890 # 出力例(Unhealthy) # TargetHealthDescriptions: # - Target: # Id: i-0123456789abcdef0 # TargetHealth: # State: unhealthy # Reason: Target.FailedHealthChecks # Description: Health checks failed with these codes: [404] # PC(検証機)からターゲットEC2のヘルスチェックエンドポイントを直接確認する curl -v http://10.0.1.10/health
・EC2側のアプリが起動しているか確認する(
systemctl status アプリ名)・セキュリティグループがALB/NLBからのインバウンドを許可しているか確認する
・ヘルスチェックパスが正しいステータスコード(200)を返しているか確認する
・ss・lsofコマンドでLinuxのポート確認を行い、ターゲットが指定ポートでLISTENしているか確認する
2. 502 Bad Gateway の対処
ターゲットEC2はHealthyだが、HTTPレスポンスが不正な場合に発生します。アプリのクラッシュ、タイムアウト、不正なHTTPレスポンス(ヘッダーなし等)が原因です。ALBのアクセスログをS3に出力する設定を事前に行っておくと、502発生時の原因究明が格段に速くなります。# ALBアクセスログを有効化する(S3バケットを事前に作成しておく) aws elbv2 modify-load-balancer-attributes \ --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/my-web-alb/abcdef1234567890 \ --attributes \ Key=access_logs.s3.enabled,Value=true \ Key=access_logs.s3.bucket,Value=my-alb-access-logs \ Key=access_logs.s3.prefix,Value=alb # アクセスログから502エラーの詳細を確認する # ログフォーマット例(抜粋・502エラー行) # https 2026-08-14T10:30:01.123456Z app/my-web-alb/xxxx 203.0.113.1:54321 10.0.1.10:80 0.001 0.005 - 502 502 0 0 "GET https://example.com/api/user HTTP/1.1" ...
3. 504 Gateway Timeout の対処
ターゲットが規定時間内にレスポンスを返せなかった場合に発生します。ALBのデフォルトのアイドルタイムアウトは60秒です。バッチ処理など時間がかかる処理をALBの後段に置く場合は値を引き上げます。# ALBのアイドルタイムアウトを変更する(秒単位・最大4000秒) aws elbv2 modify-load-balancer-attributes \ --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/my-web-alb/abcdef1234567890 \ --attributes Key=idle_timeout.timeout_seconds,Value=120 # 変更結果を確認する aws elbv2 describe-load-balancer-attributes \ --load-balancer-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/my-web-alb/abcdef1234567890 \ | grep idle_timeout
ALBとNLBの選定判断は、AWSの「設計の型」を知っていれば迷わない
ロードバランサーの種類は調べれば分かります。でも「なぜこのシステムにALBを選ぶのか」「NLBのゾーナルアイソレーションをどう設計に織り込むか」を説明できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、AWSを含む現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
本記事のまとめ
ALBとNLBの使い分けとマルチAZ実装のポイントをまとめます。| やりたいこと | コマンド |
|---|---|
| ALBを作成してマルチAZに設定する | aws elbv2 create-load-balancer --type application --subnets サブネットA サブネットB --security-groups SG_ID |
| NLBを作成してマルチAZに設定する | aws elbv2 create-load-balancer --type network --subnets サブネットA サブネットB |
| ターゲットグループを作成する | aws elbv2 create-target-group --protocol HTTP --port 80 --vpc-id VPC_ID |
| ターゲットのヘルス状態を確認する | aws elbv2 describe-target-health --target-group-arn ARN |
| クロスゾーン負荷分散の設定を確認・変更する | aws elbv2 modify-load-balancer-attributes --attributes Key=load_balancing.cross_zone.enabled,Value=true |
| ALBのアイドルタイムアウトを変更する | aws elbv2 modify-load-balancer-attributes --attributes Key=idle_timeout.timeout_seconds,Value=120 |
--subnetsに列挙するだけで完了します。503エラーが出たらまずヘルスチェック設定とセキュリティグループを確認し、504が出たらアイドルタイムアウトの値を見直す、という切り分け手順を覚えておくと、障害対応が格段に速くなります。3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AWS EC2配置グループ(Placement Group)の設計|クラスター・スプレッド・パーティション配置の使い分けとフォルトトレランス構成
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます