前回までの記事では、RDSによるマネージドデータベースの運用について解説しました。本記事では、複数のサーバーにトラフィックを分散するElastic Load Balancing(ELB)について解説します。ELBの基本概念から、ALB・NLB・CLBの違いと使い分け、ターゲットグループの設定、ヘルスチェック、リスナールールまで、可用性の高いシステムを構築するための知識を身につけましょう。

Elastic Load Balancing(ELB)とは

Elastic Load Balancing(ELB)は、AWSが提供するフルマネージドな負荷分散サービスです。受信したトラフィックを複数のターゲット(EC2インスタンス、コンテナ、IPアドレスなど)に自動的に分散し、アプリケーションの可用性とスケーラビリティを向上させます。

ELBの主な特徴

ELBには以下の特徴があります。

特徴 説明
フルマネージド インフラの管理が不要で、自動的にスケーリング
高可用性 複数のAZに自動的に分散配置されるため単一障害点なし
ヘルスチェック ターゲットの正常性を監視し、異常なターゲットへの振り分けを停止
セキュリティ統合 SSL/TLS終端、セキュリティグループ、AWS WAFとの連携が可能
従量課金 使用した時間とデータ処理量に応じた課金

なぜ負荷分散が必要か

負荷分散が必要な理由を以下に示します。

graph TB
    subgraph "単一サーバー構成の問題"
        Client1[クライアント] --> Single[EC2<br/>インスタンス]
        Single --> Problem1[障害時に<br/>サービス停止]
        Single --> Problem2[負荷集中で<br/>性能低下]
    end
graph TB
    subgraph "ELBによる負荷分散構成"
        Client2[クライアント] --> ELB[ELB]
        ELB --> EC2A[EC2-A]
        ELB --> EC2B[EC2-B]
        ELB --> EC2C[EC2-C]
        EC2A --> Benefit1[負荷分散で<br/>安定稼働]
        EC2B --> Benefit2[障害時も<br/>継続稼働]
        EC2C --> Benefit3[スケール<br/>アウト対応]
    end

負荷分散を導入することで、以下のメリットが得られます。

  • 高可用性: 1台のサーバーに障害が発生しても、他のサーバーでサービスを継続
  • スケーラビリティ: トラフィック増加に応じてサーバーを追加するだけで対応可能
  • パフォーマンス向上: 複数サーバーで負荷を分散し、レスポンス時間を短縮
  • メンテナンス容易性: ローリングアップデートやBlue/Greenデプロイメントが可能

ELBの種類と使い分け

AWSでは、用途に応じて3種類のロードバランサーを提供しています。それぞれの特徴を理解し、要件に合った選択をすることが重要です。

ELBの種類の比較

項目 ALB NLB CLB
正式名称 Application Load Balancer Network Load Balancer Classic Load Balancer
OSIレイヤー レイヤー7(アプリケーション層) レイヤー4(トランスポート層) レイヤー4/7
プロトコル HTTP、HTTPS、gRPC TCP、UDP、TLS HTTP、HTTPS、TCP、SSL
主なユースケース Webアプリケーション 低レイテンシー、高スループット レガシー互換
パスベースルーティング 対応 非対応 非対応
静的IP 非対応(固定ホスト名は可能) 対応(Elastic IP割り当て可能) 非対応
WebSocket 対応 対応 非対応
推奨度 新規Webアプリに推奨 TCP/UDP通信に推奨 非推奨(既存のみ)

どのELBを選ぶべきか

graph TD
    Start[ELBの選択] --> Q1{HTTP/HTTPSの<br/>Webアプリケーションか?}
    Q1 -->|はい| Q2{パスや<br/>ホストベースの<br/>ルーティングが必要か?}
    Q2 -->|はい| ALB[ALB<br/>Application Load Balancer]
    Q2 -->|いいえ| ALB
    Q1 -->|いいえ| Q3{TCP/UDP<br/>プロトコルを<br/>使用するか?}
    Q3 -->|はい| Q4{低レイテンシーや<br/>静的IPが必要か?}
    Q4 -->|はい| NLB[NLB<br/>Network Load Balancer]
    Q4 -->|いいえ| NLB
    Q3 -->|いいえ| Q5{既存のCLBから<br/>移行が困難か?}
    Q5 -->|はい| CLB[CLB<br/>Classic Load Balancer<br/>既存システムのみ]
    Q5 -->|いいえ| ALB

一般的なWebアプリケーションでは、ALBを選択することを推奨します。CLBはレガシーなロードバランサーであり、新規構築では使用すべきではありません。

Application Load Balancer(ALB)

ALBは、HTTP/HTTPSトラフィックの負荷分散に最適化されたロードバランサーです。レイヤー7(アプリケーション層)で動作し、URLパスやホストヘッダー、HTTPヘッダーに基づいた高度なルーティングが可能です。

ALBの構成要素

ALBは以下の要素で構成されます。

graph TB
    subgraph "ALBの構成要素"
        Internet[インターネット] --> ALB[ALB]
        ALB --> Listener[リスナー<br/>ポート・プロトコルを定義]
        Listener --> Rule1[ルール1<br/>/api/* → API TG]
        Listener --> Rule2[ルール2<br/>/static/* → Static TG]
        Listener --> Rule3[デフォルトルール<br/>→ Web TG]
        Rule1 --> TG1[ターゲットグループ<br/>API]
        Rule2 --> TG2[ターゲットグループ<br/>Static]
        Rule3 --> TG3[ターゲットグループ<br/>Web]
        TG1 --> EC2A[EC2-A]
        TG1 --> EC2B[EC2-B]
        TG2 --> EC2C[EC2-C]
        TG3 --> EC2D[EC2-D]
        TG3 --> EC2E[EC2-E]
    end

リスナー

リスナーは、ELBが受け付けるトラフィックのポートとプロトコルを定義します。

設定項目 説明 ALBでの例
プロトコル 受け付けるプロトコル HTTP、HTTPS
ポート 受け付けるポート番号 80、443
デフォルトアクション ルールに一致しない場合の動作 ターゲットグループへ転送、固定レスポンス

HTTPSリスナーを設定する場合、SSL/TLS証明書をALBに関連付けます。AWS Certificate Manager(ACM)で無料の証明書を取得し、ALBに設定するのが一般的です。

ターゲットグループ

ターゲットグループは、トラフィックの転送先となるターゲットの論理的なグループです。

ターゲットタイプ 説明 ユースケース
インスタンス EC2インスタンスID 従来のEC2ベースのアプリケーション
IP IPアドレス コンテナ、オンプレミスサーバー
Lambda関数 Lambda関数ARN サーバーレスアプリケーション
ALB ALBのARN NLB → ALBの連携

ターゲットグループの設定例を以下に示します。

設定項目 説明 推奨値
プロトコル/ポート ターゲットへの転送プロトコルとポート HTTP/80
VPC ターゲットが属するVPC アプリケーションのVPC
ヘルスチェック ターゲットの正常性確認設定 後述
スティッキーセッション 同じクライアントを同じターゲットへ セッション管理が必要な場合

ルーティングルール

ALBでは、リクエストの内容に基づいて柔軟なルーティングが可能です。

条件タイプ 説明
パスパターン URLパスに基づくルーティング /api/*/images/*
ホストヘッダー ホスト名に基づくルーティング api.example.comwww.example.com
HTTPヘッダー HTTPヘッダーの値に基づくルーティング X-Custom-Header: value
HTTPメソッド HTTPメソッドに基づくルーティング GETPOST
クエリ文字列 クエリパラメータに基づくルーティング ?version=v2
送信元IP クライアントIPに基づくルーティング 特定のIP範囲からのアクセス制御

ルーティングルールの設定例を示します。

graph LR
    subgraph "パスベースルーティングの例"
        Client[クライアント] --> ALB[ALB]
        ALB -->|/api/*| API[API サーバー群]
        ALB -->|/admin/*| Admin[管理画面サーバー]
        ALB -->|それ以外| Web[Webサーバー群]
    end

ALBのアクションタイプ

リスナールールのアクションには以下の種類があります。

アクションタイプ 説明 ユースケース
forward ターゲットグループへ転送 通常のトラフィック転送
redirect 別のURLへリダイレクト HTTP→HTTPSのリダイレクト
fixed-response 固定レスポンスを返却 メンテナンスページ、ヘルスチェック応答
authenticate-cognito Cognitoによる認証 ユーザー認証が必要なアプリ
authenticate-oidc OIDCプロバイダーによる認証 外部IdPとの連携

HTTP→HTTPSリダイレクトの設定は以下のように行います。

設定項目
アクションタイプ redirect
プロトコル HTTPS
ポート 443
ステータスコード HTTP_301(恒久的リダイレクト)

Network Load Balancer(NLB)

NLBは、TCP/UDP/TLSトラフィックの負荷分散に特化したロードバランサーです。レイヤー4(トランスポート層)で動作し、超低レイテンシーと高スループットを実現します。

NLBの特徴

特徴 説明
超低レイテンシー マイクロ秒レベルのレイテンシーで処理
高スループット 毎秒数百万リクエストを処理可能
静的IP AZごとに静的IPを1つ持ち、Elastic IPも割り当て可能
送信元IPの保持 クライアントの送信元IPアドレスをターゲットに渡せる
長時間接続 WebSocket、IoTなどの長時間接続をサポート

NLBのユースケース

NLBが適しているユースケースを以下に示します。

  • ゲームサーバー: UDP通信、低レイテンシー要件
  • IoTプラットフォーム: 大量のデバイスからの接続、長時間セッション
  • 金融システム: 超低レイテンシー、高信頼性要件
  • メールサーバー: SMTP、IMAP、POP3などのTCP通信
  • VPNゲートウェイ: 静的IPアドレスが必要なシナリオ

ALBとNLBの組み合わせ

高度なアーキテクチャでは、NLBとALBを組み合わせることがあります。

graph TB
    subgraph "NLB + ALB構成"
        Internet[インターネット] --> NLB[NLB<br/>静的IP提供]
        NLB --> ALB[ALB<br/>L7ルーティング]
        ALB --> TG1[ターゲットグループ1]
        ALB --> TG2[ターゲットグループ2]
    end

この構成により、静的IPアドレスの提供(NLB)とHTTPレベルの高度なルーティング(ALB)を両立できます。

ヘルスチェック

ヘルスチェックは、ELBがターゲットの正常性を監視する仕組みです。異常と判定されたターゲットには、トラフィックが振り分けられなくなります。

ヘルスチェックの設定項目

設定項目 説明 ALBのデフォルト値
プロトコル ヘルスチェックに使用するプロトコル HTTP
パス ヘルスチェックのリクエストパス /
ポート ヘルスチェックのポート トラフィックポート
正常のしきい値 正常と判定するまでの連続成功回数 5回
異常のしきい値 異常と判定するまでの連続失敗回数 2回
タイムアウト レスポンスのタイムアウト時間 5秒
間隔 ヘルスチェックの実行間隔 30秒
成功コード 正常と判定するHTTPステータスコード 200

ヘルスチェックのベストプラクティス

graph TB
    subgraph "ヘルスチェックの流れ"
        ELB[ELB] -->|GET /health| Target[ターゲット]
        Target -->|200 OK| ELB
        ELB -->|正常判定| Healthy[Healthy<br/>トラフィック転送]
        
        ELB2[ELB] -->|GET /health| Target2[ターゲット]
        Target2 -->|タイムアウト/5xx| ELB2
        ELB2 -->|異常判定| Unhealthy[Unhealthy<br/>トラフィック停止]
    end

ヘルスチェックのベストプラクティスを以下に示します。

  1. 専用のヘルスチェックエンドポイントを用意する

    • /health/healthzなど、ヘルスチェック専用のパスを作成
    • データベースやキャッシュへの接続確認を含めた深いヘルスチェックを実装
  2. 適切なしきい値を設定する

    • 異常しきい値は2〜3回(一時的な障害を検知)
    • 正常しきい値は2〜3回(安定してから復帰)
  3. タイムアウトと間隔のバランス

    • タイムアウトは間隔より短く設定
    • 障害検知の速度とシステム負荷のトレードオフを考慮

ヘルスチェックエンドポイントの実装例(Node.js/Express)を示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
app.get('/health', async (req, res) => {
  try {
    // データベース接続確認
    await db.query('SELECT 1');
    
    // キャッシュ接続確認
    await redis.ping();
    
    res.status(200).json({ status: 'healthy' });
  } catch (error) {
    res.status(500).json({ status: 'unhealthy', error: error.message });
  }
});

ターゲットの状態

ターゲットは以下の状態を持ちます。

状態 説明
initial ターゲット登録中、ヘルスチェック未実施
healthy ヘルスチェック成功、トラフィック受信可能
unhealthy ヘルスチェック失敗、トラフィック停止
unused ターゲットが登録されていないか、未使用のAZ
draining 登録解除中、既存の接続を完了させている

ALBの構築手順

AWSマネジメントコンソールを使用したALBの構築手順を説明します。

前提条件

ALBを構築する前に、以下の準備が必要です。

  • VPCと2つ以上のAZにまたがるサブネット
  • ターゲットとなるEC2インスタンス
  • ALB用のセキュリティグループ

手順1: ALBの基本設定

EC2コンソールから「ロードバランサー」→「ロードバランサーの作成」を選択し、ALBを選びます。

設定項目 説明 設定例
名前 ALBの識別名 my-web-alb
スキーム インターネット向けか内部向けか internet-facing
IPアドレスタイプ IPv4のみかデュアルスタックか IPv4
VPC ALBを配置するVPC my-vpc
マッピング ALBを配置するAZとサブネット ap-northeast-1a, ap-northeast-1c

手順2: セキュリティグループの設定

ALB用のセキュリティグループを設定します。

タイプ プロトコル ポート ソース 説明
インバウンド HTTP 80 0.0.0.0/0 HTTPアクセス許可
インバウンド HTTPS 443 0.0.0.0/0 HTTPSアクセス許可
アウトバウンド すべて すべて 0.0.0.0/0 任意の宛先への通信

EC2インスタンスのセキュリティグループでは、ALBからのトラフィックのみを許可します。

タイプ プロトコル ポート ソース 説明
インバウンド HTTP 80 ALBのセキュリティグループ ALBからのアクセスのみ許可

手順3: リスナーとルーティングの設定

リスナーとターゲットグループを設定します。

リスナー設定
プロトコル HTTP
ポート 80
デフォルトアクション ターゲットグループへ転送

手順4: ターゲットグループの作成

設定項目
ターゲットタイプ インスタンス
ターゲットグループ名 my-web-tg
プロトコル HTTP
ポート 80
VPC my-vpc
ヘルスチェックパス /health

手順5: ターゲットの登録

作成したターゲットグループにEC2インスタンスを登録します。登録後、ヘルスチェックが成功すると、トラフィックの受信が開始されます。

ALBとAuto Scalingの連携

ALBはAuto Scalingと連携することで、負荷に応じた自動的なスケーリングを実現できます。

graph TB
    subgraph "ALB + Auto Scaling構成"
        Internet[インターネット] --> ALB[ALB]
        ALB --> TG[ターゲットグループ]
        TG --> ASG[Auto Scaling<br/>グループ]
        ASG --> EC2A[EC2-A]
        ASG --> EC2B[EC2-B]
        ASG --> EC2C[EC2-C]
        
        CloudWatch[CloudWatch] -->|メトリクス| ASG
        ASG -->|スケールアウト| NewEC2[新規EC2]
        NewEC2 -->|自動登録| TG
    end

Auto Scalingグループの設定で、ターゲットグループを指定することで、新しく起動したインスタンスが自動的にターゲットグループに登録されます。また、インスタンスが終了する際は、自動的にターゲットグループから登録解除されます。

Auto Scalingの詳細については、次回の記事で解説します。

クロスゾーン負荷分散

クロスゾーン負荷分散は、複数のAZにまたがってトラフィックを均等に分散する機能です。

クロスゾーン負荷分散の仕組み

graph TB
    subgraph "クロスゾーン負荷分散無効"
        Internet1[インターネット<br/>100%] --> ELBAZ1[ELB<br/>AZ-a<br/>50%]
        Internet1 --> ELBAZ2[ELB<br/>AZ-c<br/>50%]
        ELBAZ1 --> EC2A1[EC2-A1<br/>25%]
        ELBAZ1 --> EC2A2[EC2-A2<br/>25%]
        ELBAZ2 --> EC2C1[EC2-C1<br/>50%]
    end
graph TB
    subgraph "クロスゾーン負荷分散有効"
        Internet2[インターネット<br/>100%] --> ELBAZ3[ELB<br/>AZ-a]
        Internet2 --> ELBAZ4[ELB<br/>AZ-c]
        ELBAZ3 --> EC2B1[EC2-A1<br/>33%]
        ELBAZ3 --> EC2B2[EC2-A2<br/>33%]
        ELBAZ3 -.-> EC2D1[EC2-C1<br/>33%]
        ELBAZ4 -.-> EC2B1
        ELBAZ4 -.-> EC2B2
        ELBAZ4 --> EC2D1
    end
設定 ALB NLB
デフォルト 有効 無効
変更可否 無効化不可 有効化可能
追加料金 なし AZ間データ転送料金が発生

ALBでは常にクロスゾーン負荷分散が有効なため、AZ間でインスタンス数が異なる場合でも均等に負荷が分散されます。

スティッキーセッション

スティッキーセッション(セッションアフィニティ)は、同じクライアントからのリクエストを同じターゲットに継続的に転送する機能です。

スティッキーセッションの種類

タイプ 説明 ユースケース
期間ベース ELBが生成するCookieで一定期間維持 シンプルなセッション管理
アプリケーションベース アプリケーションが生成するCookieを使用 独自のセッション管理

スティッキーセッションの設定

設定項目 説明 推奨値
スティッキー期間 セッションを維持する時間 アプリケーションのセッションタイムアウトに合わせる
Cookie名 アプリケーションベースの場合のCookie名 AWSALB(期間ベース)、任意(アプリベース)

スティッキーセッションを有効にすると、特定のターゲットに負荷が集中する可能性があります。可能であれば、外部のセッションストア(Redis、DynamoDBなど)を使用してステートレスな設計を検討することを推奨します。

ELBのセキュリティ設定

ELBのセキュリティを強化するための設定について説明します。

SSL/TLS設定

ALBでHTTPS通信を行う場合、SSL/TLS証明書の設定が必要です。

証明書タイプ 説明 推奨度
ACM証明書 AWS Certificate Managerで発行・管理 推奨
IAM証明書 IAMにアップロードした証明書 既存証明書がある場合
インポート証明書 ACMにインポートした外部証明書 特定の証明書が必要な場合

ACMで証明書を発行する場合、ドメインの所有権確認(DNS検証またはメール検証)が必要です。

セキュリティポリシー

ALBのセキュリティポリシーは、サポートするTLSバージョンと暗号スイートを定義します。

ポリシー名 TLSバージョン 推奨用途
ELBSecurityPolicy-TLS13-1-2-2021-06 TLS 1.2、1.3 最新のセキュリティ要件
ELBSecurityPolicy-2016-08 TLS 1.0、1.1、1.2 レガシークライアント対応
ELBSecurityPolicy-FS-1-2-Res-2020-10 TLS 1.2(FS対応) PCI DSS準拠

一般的なWebアプリケーションでは、TLS 1.2以上を要求するポリシーを選択することを推奨します。

AWS WAFとの連携

ALBはAWS WAF(Web Application Firewall)と連携し、SQLインジェクションやクロスサイトスクリプティングなどの攻撃から保護できます。

graph LR
    Internet[インターネット] --> WAF[AWS WAF]
    WAF -->|許可| ALB[ALB]
    WAF -->|ブロック| Block[ブロック]
    ALB --> Targets[ターゲット]

ELBのモニタリング

ELBの運用状態を監視するための方法を説明します。

CloudWatchメトリクス

ELBは自動的にCloudWatchにメトリクスを送信します。

メトリクス 説明 監視のポイント
RequestCount リクエスト数 トラフィック量の把握
HTTPCode_Target_2XX_Count 2xxレスポンス数 正常なリクエストの割合
HTTPCode_Target_5XX_Count 5xxレスポンス数 サーバーエラーの検知
HTTPCode_ELB_5XX_Count ELB起因の5xxエラー ELB自体の問題検知
TargetResponseTime ターゲットの応答時間 パフォーマンス監視
HealthyHostCount 正常なターゲット数 可用性の監視
UnHealthyHostCount 異常なターゲット数 障害の検知

アクセスログ

ALBのアクセスログを有効にすることで、詳細なリクエスト情報をS3に保存できます。

ログ項目 説明
timestamp リクエストの日時
elb ELBの名前
client:port クライアントのIPとポート
target:port ターゲットのIPとポート
request_processing_time リクエスト処理時間
target_processing_time ターゲットの処理時間
response_processing_time レスポンス処理時間
elb_status_code ELBのステータスコード
target_status_code ターゲットのステータスコード
request リクエストの詳細

アクセスログはトラブルシューティングやセキュリティ分析に活用できます。

ELB料金の考慮点

ELBの料金は以下の要素で構成されます。

料金要素 ALB NLB
時間料金 約0.0225 USD/時間 約0.0225 USD/時間
処理料金 LCU(Load Balancer Capacity Units) NLCU(Network Load Balancer Capacity Units)

LCUは以下の4つのディメンションの最大値で計算されます。

  • 新規接続数
  • アクティブ接続数
  • 処理バイト数
  • ルール評価数

コスト最適化のポイントを以下に示します。

  • 不要なリスナールールを削除する
  • 使用していないロードバランサーを削除する
  • 開発環境では時間帯に応じて停止を検討(ただし、ALBは停止機能がないため削除が必要)

まとめ

本記事では、ELB(Elastic Load Balancing)の基本概念から、ALB・NLB・CLBの違い、ターゲットグループの設定、ヘルスチェック、リスナールールまでを解説しました。

重要なポイントをまとめます。

  • ELBの種類: 新規のWebアプリケーションにはALB、TCP/UDP通信にはNLBを選択
  • ALBの構成要素: リスナー、ルール、ターゲットグループの3つで構成
  • ヘルスチェック: ターゲットの正常性を監視し、異常時はトラフィックを停止
  • セキュリティ: SSL/TLS設定、セキュリティポリシー、WAF連携で多層防御
  • モニタリング: CloudWatchメトリクスとアクセスログで運用状態を監視

次回の記事では、Auto Scalingを使用した自動スケーリングの設定方法について解説します。ELBとAuto Scalingを組み合わせることで、負荷に応じて自動的にスケールする高可用性なシステムを構築できます。

参考リンク