前回までの記事では、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/>性能低下]
endgraph 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.com、www.example.com |
| HTTPヘッダー | HTTPヘッダーの値に基づくルーティング | X-Custom-Header: value |
| HTTPメソッド | HTTPメソッドに基づくルーティング | GET、POST |
| クエリ文字列 | クエリパラメータに基づくルーティング | ?version=v2 |
| 送信元IP | クライアントIPに基づくルーティング | 特定のIP範囲からのアクセス制御 |
ルーティングルールの設定例を示します。
graph LR
subgraph "パスベースルーティングの例"
Client[クライアント] --> ALB[ALB]
ALB -->|/api/*| API[API サーバー群]
ALB -->|/admin/*| Admin[管理画面サーバー]
ALB -->|それ以外| Web[Webサーバー群]
endALBのアクションタイプ
リスナールールのアクションには以下の種類があります。
| アクションタイプ | 説明 | ユースケース |
|---|---|---|
| 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ヘルスチェックのベストプラクティスを以下に示します。
-
専用のヘルスチェックエンドポイントを用意する
/healthや/healthzなど、ヘルスチェック専用のパスを作成- データベースやキャッシュへの接続確認を含めた深いヘルスチェックを実装
-
適切なしきい値を設定する
- 異常しきい値は2〜3回(一時的な障害を検知)
- 正常しきい値は2〜3回(安定してから復帰)
-
タイムアウトと間隔のバランス
- タイムアウトは間隔より短く設定
- 障害検知の速度とシステム負荷のトレードオフを考慮
ヘルスチェックエンドポイントの実装例(Node.js/Express)を示します。
|
|
ターゲットの状態
ターゲットは以下の状態を持ちます。
| 状態 | 説明 |
|---|---|
| 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
endAuto 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%]
endgraph 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を組み合わせることで、負荷に応じて自動的にスケールする高可用性なシステムを構築できます。