AWS再入門ブログリレー Elastic Load Balancing編

2020.08.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、onz(オンジー)です!

当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2020』の 7日目のエントリです。

このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWS をこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとっても AWSサービスの再発見や2020 年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

では、さっそくいってみましょう。7日目のテーマはElastic Load Balancingです。

※以下の略称を使います。

LB = Load Balancing

ELB = Elastic Load Balancing

ALB = Application Load Balancer

NLB = Network Load Balancer

CLB = Classic Load Balancer

なぜLBが必要か?

ELBはAWSクラウド上のロードバランシング(LB)サービスです。

ではそもそもLBはなぜ必要なのでしょう?

理由としては大きく二つあります。

  • 冗長化/可用性
  • 負荷分散/スケール

(引用元)20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)

冗長化/可用性

LBがなくサーバ1台構成の場合、そのサーバが何らかの理由でダウンすると即そのままユーザーに影響が出てしまいます。

LBがあり複数のサーバーが稼働している場合、1台のサーバーがダウンしてもサービスが継続できます。

負荷分散/スケール

LBがなくサーバ1台構成の場合、ユーザー数が増えてくると負荷が高まっていきクラッシュしてしまう可能性があります。

LBがあり複数のサーバーに負荷分散している場合、ユーザー数が増えていってもそれぞれのサーバーに処理が振り分けられますしサーバーを追加することでスケールしていくこともできます。

ELBの特徴

本題のELBです。AWSが提供するLBサービスです。

ELBで実現できるシステム

LBの必要性で説明したポイントがELBでは実現できます。

  • スケーラブル:複数のEC2インスタンス/ECSコンテナ...etc(ターゲット)に負荷分散する、またスケールしていく仕組み
  • 高い可用性:複数のアベイラビリティゾーンにある複数のターゲットの中から正常なターゲットにのみ振り分け

ELB自体の特徴

  • スケーラブル:ELB自体も負荷に応じてキャパシティを自動増減
  • 安価な従量課金:従量課金で利用可能
  • 運用管理がラク:マネージドサービスなので管理が不要
  • 豊富な連携機能:Auto Scaling,Route 53,Cloud Formationなどと連携

ELB自体も自動でスケールしてくれる、しかもマネージドサービスとして提供されるということで自前のLBに比べて導入コストを抑えることができます。これは非常に大きなメリットですね。

注意点としてELB(ALB/CLB)がスケールするときはIPアドレスが変化しますのでELBにアクセスするときは必ずDNS名を使いましょう

xxxxxxx-xxxxxxxx.ap-northeast-1.elb.amazonaws.com みたいな形式です。

(引用元)20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)

ELBの種類

マネージドコンソールを開いてみると次の3種類があることがわかります。

基本的にはALBとNLBを使用することが推奨されており特殊なケース(互換性が必要など)の場合のみCLBを使います。本入門記事ではCLBについてはあまり触れません。

Application Load Balancer

  • 通称:ALB
  • HTTP/HTTPSのみに対応した(TCPには対応していない)L7ロードバランサー
    • L7はアプリケーション層のこと
  • コンテンツベースのルーティング(高度なリクエストルーティング)が可能

Network Load Balancer

  • 通称:NLB
  • TCP/UDPに対応したL4ロードバランサー
    • L4はトランスポート層のこと
  • 暖機不要で高可用性、高スループット、低レイテンシ
  • Source IP/Portがターゲットまで保持される
  • 固定IPを持つ

Classic Load Balancer

  • 通称:CLB
  • 特殊なケースのみに利用し、多くのケースではALBかNLBで十分
  • 既存のCLBはALBかNLBへの移行を推奨

詳細な比較は下記の表になります。

機能 ALB NLB CLB
プロトコル HTTP、HTTPS TCP、UDP、TLS TCP、SSL/TLS、HTTP、HTTPS
プラットフォーム VPC VPC EC2-Classic、VPC
ヘルスチェック
CloudWatch メトリクス
ログ記録
ゾーンごとのフェイルオーバー
Connection Draining (登録解除の遅延)
同一のインスタンスで複数ポートに負荷分散
IP アドレスをターゲットに設定 ✔ (TCP、TLS)
ロードバランサーの削除保護
設定可能なアイドル接続のタイムアウト
クロスゾーン負荷分散
スティッキーセッション
静的 IP アドレス
Elastic IP アドレス
送信元 IP アドレスの保持
リソースベースの IAM アクセス許可
タグベースの IAM アクセス許可
スロースタート
WebSocket 対応
PrivateLink のサポート ✔ (TCP、TLS)
ソース IP アドレス CIDR ベースのルーティング
レイヤー 7
パスベースのルーティング
ホストベースのルーティング
ネイティブ HTTP/2 対応
リダイレクト
固定レスポンス
ターゲットとしての Lambda 関数
HTTP ヘッダーベースのルーティング
HTTP メソッドベースのルーティング
クエリ文字列パラメータベースのルーティング
セキュリティ
SSL のオフロード
Server Name Indication (SNI)
バックエンドサーバーの暗号化
ユーザー認証
カスタムセキュリティポリシー

(引用)Elastic Load Balancing の特徴

ELBの全体的なイメージ

シンプルなイメージでELBで使われる用語を紹介します。

(引用元)20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)

リスナー:LBがListenするプロトコルとポート番号、LBからターゲットへの接続用のプロトコルとポート番号などを設定

ターゲット:LBがトラフィックを転送するEC2インスタンスなどのリソースやエンドポイント

ELBの使い方

よく使われる構成を紹介します。

(引用元)20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)

ポイント

  • AWSのベストプラクティスとして複数のアベイラビリティゾーンに跨ってELBを配置している
    • ELB自体の可用性を高めることができる
  • ELBにSecurity Groupを設定可能
    • 特定IPのユーザーのみアクセスできるようにする等の制御が可能になる
    • ただしNLBはSecurity Groupに関連付けられないので注意
  • バックエンドのEC2インスタンスはELBからのリクエストのみを許可する設定が推奨される

(引用元)20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)

ポイント

  • ターゲットの種類は大きく三つ
    • インスタンスIDでターゲットを指定
    • IPアドレスでターゲットを指定(CLB以外)
    • Lambda関数をターゲットに指定(ALBのみ)

(引用元)20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)

外部に公開するサービスにELBを使う場合はカスタムドメインを利用することが多いと思います。

  • Route 53を使用する場合
    • エイリアスレコードでの登録
    • またはCNAMEでの登録も可能
  • Route 53を使用せず別のDNSを使用する場合
    • CNAMEで登録
  • Zone Apexの場合
    • Route 53のエイリアスレコードでの登録
    • 通常のDNSサーバではCNAME設定不可

ELBの基本機能

高可用性と負荷分散

複数AZでの負荷分散
  • 2段階の負荷分散
    • 「ELBのDNSへのアクセス→各AZへのELB」が第一段階
    • 「各ELB→バックエンドのEC2」が第二段階
      • ALBの場合はラウンドロビンルーティングで振り分けられる

ルーティングについてより詳しく知りたい場合は下記をご参考ください。

クロスゾーン負荷分散

複数AZでの負荷分散をしている構成でバックエンドキャパシティが異なっていてもゾーンを跨いで負荷を均等にするよう分散してくれる。

バックエンドキャパシティが異なるというのは例えばaゾーンではEC2インスタンスが2台でbゾーンではEC2インスタンスが3台になっているような状態のこと。

ALBではデフォルトで有効になっているがNLBではデフォルトで無効になっていることに注意。

同一のインスタンスで複数ポートに負荷分散可能

1つのインスタンス上に複数のポートが空いているときにポートで負荷分散してくれる設定。

コンテナを用いる際には同一インスタンス上で複数のコンテナ(サーバー )を運用する必要があるので有用。

IPアドレスをターゲットに設定

オンプレミスのサーバなどを含めて負荷分散するときに有用。

ELB自体のスケーリング

先に説明した通りELB自体は自動スケールします。

ただしALB/CLBはリクエストの瞬間的な急増が発生しスケーリングが間に合わなかった場合、HTTP503を返します。

これを回避するには事前にALB/CLBをスケールさせておく必要があり方法は二つあります。

  • Pre-Warming(暖機運転)の申請をサポートケースにて行う
    • ※Business/Enterpriseサポート要
  • 自前で負荷を段階的にかけてスケールさせておく

なおNLBは暖機不要で突発的なトラフィックも捌けます。

ELBのモニタリング・ログ

ヘルスチェック

ELBはヘルスチェックで正常なターゲットにのみトラフィックをルーティングします。

正常判定の閾値などを設定することができます。

運用のモニタリング

CloudWatchによってELBのメトリクスを監視可能です。

例えはHealthyHostCount(正常なバックエンドのホスト数)などがあります。

メトリクスの種類については下記をご参照ください。

アクセスログの記録

ELBのアクセスログを指定したS3バケットに簡単に自動保管できます。

アクセスログの出力フィールドについてなど、詳細は下記をご参照ください。

コネクション

ELBのコネクションのタイムアウト

無通信状態が続くと設定した時間でそのコネクションを自動で切断します。

Connection Draining(登録解除の遅延)

バックエンドのEC2インスタンスをELBから登録解除したり、ヘルスチェックが失敗した時に、新規リクエストの割り振りは中止して、処理中のリクエストは一定期間待ちます。

つまりバックエンドに異常があっても処理中のリクエストがいきなりぶちっと切れないようにする機能になります。

スティッキーセッション

同じユーザから来たリクエストを全て同じEC2インスタンスに送信する機能です。

アプリケーションでのセッション情報、一時ファイルなどをEC2インスタンスが保持する構成の場合に必要になります。

なお基本的にはEC2にセッション情報等を保存せずに別のDBサーバやElastiCache等に保存する構成が推奨されます。

EC2インスタンスの増減を柔軟にできるようになるためです(ステートレスな状態)。

セキュリティ関連

SSL/TLS Termination

ELB側でSSL/TLS認証ができるという機能でよく使われる重要な機能です。

ELBでSSL Terminationし、バックエンドとはSSLなしの構成にすることで複数のEC2インスタンスそれぞれにSSL証明書を設定するような手間をなくしてくれます。

事前定義されたセキュリティポリシー

SSL/TLS利用時に事前定義されたセキュリティポリシーを利用することができます。

詳細はこちらを参照ください。

HTTPS/SSL利用時のTLSサーバ証明書

AWS Certificate Manager(ACM)を使用すれば証明書のリクエスト、管理、更新、プロビジョニングが容易に実行可能です。ELBに対しては無料です。

ただし発行される証明書はドメイン認証タイプ(DV)なのでOV,EVを使う必要がある場合はサードパーティの証明書をインポートする必要がある点は注意です。

SNIでの複数TLS証明書のスマートセレクション

1つのALB/NLBのリスナーに複数のTLS証明書を設定可能にする機能。

1つのALB/NLBで複数のドメインを運用する構成で有用です。

ALBの機能

ALBのコンポーネント

(引用元)20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)

  • リスナー:LBでListenするポートとプロトコルとユーザーが定義したルールを含む設定
  • ルール:リクエストがどのように転送されるかを条件とアクションで定義
  • ターゲット:LBがトラフィックを転送するEC2などのリソースやエンドポイント
  • ターゲットグループ:EC2インスタンスなどのターゲットの集合

コンテンツベースのルーティング

以下のような種類があります。

(引用元)20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)

ルールの条件とアクション

以下のような種類があります。

(引用元)20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)

ルールは複数設定できるので例えばルール1がfalseならルール2で評価、それもfalseならデフォルトルールによってアクションが決められる、といった柔軟なフローが決められます。

ALBのユーザー認証機能

初めてアクセスするユーザーに対しては認証画面をリダイレクトさせて認証を挟むことが可能になります。

Amazon CognitoやOIDC IdPを使うことができます。

(引用元)20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)

ALB利用時のクライアントのIPアドレス取得

ターゲット側のアクセスログにはALBのIPアドレスが記録されます。

クライアントのIPアドレスを取得したい場合はX-Forwarded-Forヘッダーを使用する必要があります。

NLBの場合は何も設定せずに透過的にクライアントのIPアドレスが取得可能です。

NLBの機能

高可用性・高スループット、低レイテンシ

  • 高可用性
    • DNS名ならUnhealthyなAZのIPアドレスが自動削除される
    • 長時間セッションも維持が可能
  • 高スループット
    • 暖機不要で突発的なトラフィックも捌ける
    • 固定IPのまま動的にスケールする
  • 低レイテンシ
    • TCP負荷分散を同一AZ内で行う
    • 単一AZ構成も可能(ALBは複数AZ構成が必須)

Source IP/Portがターゲットまで保持

  • クライアントのSource IPとPortがそのままターゲットまで届く
  • ターゲットのSecurity GroupでクライアントIPの接続を許可する必要あり
    • NLBはSecurity Groupが設定できないのでバックエンドでNLBのSecurity Groupのみを指定して通信を許可するといったことができない

固定IP

  • Internet-facing、Internal共にIPアドレスが固定
  • NLB作成時に自動割り当てされたIPアドレス、またはNLB作成時に指定した自分が持っているElasticIPのいずれか
  • よくあるユースケースとしてFirewallの制約等でELBのIPアドレスの固定が必要なケースがある

他サービスとの連携

Auto Scalingとの連携

  • Auto Scalingによるインスタンス増減時にELBへの追加・削除が可能
    • 例えばAuto Scaling group内のCPU使用率が70%を超えたら1台追加、といった構成にすることができる
  • ELBのヘルスチェックの結果をAuto Scalingに反映可能

ECSとの連携

動的ポートマッピングにより各タスクに割り振られたECSクラスタ上のポートをターゲットグループに自動的に登録することができる。

AWSWAFとの連携

ALBに対してAWS WAFを適用可能、以下のような保護が可能になる。

  • リクエストレートによるアクセス制限(Rate Limit)
  • 特定のIPアドレスや地域からのアクセスを制限
  • クロスサイトスクリプティングやSQLインジェクションからの保護
  • HTTPヘッダー、HTTP本文、URI文字列に対するサイズ制約や正規表現でのマッチング

Global Acceleratorとの連携

Global Acceleratorの配下にALB/NLBを配下に指定できる。

これによってユーザーが一番近いリージョンからよりグローバルに高速にアクセスができるようになる。

参考

20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)

おしまい

以上、『AWS 再入門ブログリレー 2020』の 7日目のエントリ『Elastic Load Balancing』編でした。 明日 (8/13) は hiroyuki kaji さんの「Amazon EventBridge」の予定です。お楽しみに!!