前回は、コーポレートサイトのシステムの可用性をさらに向上させる準備として、EC2インスタンス1台にWebサーバー、アプリケーションサーバー(以下Web・APサーバー)、DBサーバーを稼働させる構成から、DBサーバーを切り出す作業を行いました。これにより、Web・APサーバーはいわゆる「ステートレス」なサーバーになりました。

 ここでいうステートレスとは、セッション情報やユーザーがアップロードしたコンテンツなどをサーバー外部のデータストアーに逐一永続化することで、任意のサーバーで処理を実行できるようにした状態を表します。

 ステートレスにすることで、コーポレートサイトへのアクセスが増えたとき、水平スケーリング(サーバー台数の増加による処理能力の向上)を行えます。

 Web・APサーバーを複数台の構成にしたら、外部からのリクエストをそれらに振り分ける必要があります。これには一般に、ロードバランサーを使います。

 AWSはロードバランサーのマネージドサービス「Elastic Load Balancing(ELB)」を提供しています。ELBは、アプリケーションへのトラフィックを複数台のEC2インスタンスに振り分けます。システムの負荷が高くなったら、手動あるいは自動で起動させたEC2インスタンスをELBに追加登録することで、システム全体の処理性能を高められます。

 一般的なロードバランサー同様、異常なEC2インスタンスを検出し、正常なEC2インスタンスのみにルーティングします。さらにELBは同一リージョンであれば、アベイラビリティーゾーン(AZ)を横断した振り分けが可能です。これにより、1カ所のAZが全面的に利用できなくなるといったデータセンターレベルの障害が発生した場合でも、システムを停止させない運用が可能です。

シンプルなCLB、パスに基づき振り分けるALB

 ELBには、Classic Load Balancer(CLB)とApplication Load Balancer(ALB)という二つのタイプがあります(2017年9月に登場したNetwork Load Balancerについてはあとで触れます)。

 CLBは主にL4(OSI参照モデルのトランスポート層)の分散機能を提供するロードバランサーです。複数のEC2インスタンスのシンプルな負荷分散に適しています。

 ALBはL7(同アプリケーション層)の分散機能を提供し、リクエストのパスといったパケットの内容に基づいてトラフィックをルーティングすることができます。例えば「http://intranet.aaa.co.jp/X/」というパスが含まれたリクエストはXサーバーに、「http://intranet.aaa.co.jp/Y/」というリクエストはYサーバーに振り分けます。

 さらにトラフィックを複数のサービスにルーティングしたり、同じEC2インスタンスの複数のポート間で負荷分散したりする機能を持つので、高度なルーティング機能、マイクロサービス、コンテナベースのアーキテクチャーが必要なアプリケーションには不可欠です。

 以降では、CLBとALBに共通する、ELBの主な機能を紹介します。最初に、負荷分散の機能を解説し、セキュリティ強化に役立つ機能、運用に役立つ機能を説明します。

仮想マシンごとの偏り減らすクロスゾーン負荷分散

 まず負荷分散機能です。複数のAZに配置したEC2インスタンスを登録すると、2段階で負荷分散を行います。

 第1段階として、「DNSラウンドロビン」によって各AZに対して均等にリクエストを振り分けます。DNSラウンドロビンとは「itpro.nikkeibp.co.jp」のような1個のドメイン名に複数のIPアドレスを登録しておき、クライアントからDNSリクエストがあると、登録されたIPアドレスを順番に返していく方式です。

 東京リージョンのAZ-AとAZ-Cという二つのAZに配置したEC2インスタンスをELBに登録している場合、100のリクエストが来ると各AZに50ずつのリクエストを振り分けます。

 第2段階として、AZごとにELBインスタンスが配置され、届いたリクエストを配下のEC2インスタンスに振り分けます。上述の例でAZ-Aに5台のEC2インスタンスが登録されていれば、10ずつのリクエストを受け取ります。AZ-Cが2台のEC2インスタンスなら25ずつのリクエストになります。

 このように、AZごとのEC2インスタンスの台数が違うと、1台当たりの負荷に偏りが生じます。

 この問題を解決するため、ELBでは「クロスゾーン負荷分散」という機能を提供しています。この機能を有効にすると、ELBはAZに関係なく、登録されている全てのEC2インスタンスに均等にトラフィックをルーティングします。これにより、AZごとのEC2インスタンスの台数が大きく異なっていても、負荷を平準化できます。

 クロスゾーン負荷分散は、ALBでは常に有効ですが、CLBではデフォルトで無効になっています。有効にしておくことをお勧めします。