AWS Application Load Balancer は、アプリケーションレイヤーで負荷分散ができるロードバランサーです。HTTPリクエストを元に、ロードバランサー配下のサーバーに処理を振り分けられるのが特徴とされています。また、HTTP/2、WebSocket、セッション維持などにも対応しています。
Application Load Balancer の設定は、HTTP(S) 標準のポート80番やポート443番だけで設定するのであれば、特に迷うことはないと思いますが、たまたまロードバランサーやサーバーの待ち受けポートを変えて複数設定することがあり、ポートの設定方法に小一時間悩んでしまいました。そこで今回は、AWS Application Load Balancer を複数ポートで設定する手順をメモしておこうと思います。
Application Load Balancer の設定概要
Application Load Balancer(図のALB)を、ポート80番とポート2301番で待ち受けするように設定し、受信ポート80番のターゲットグループと、受信ポート2301番のターゲットグループにそれぞれ振り分けます。
上の図では表現できていませんが、ターゲットグループを2つ作成し、同じEC2インスタンスを別のポートで登録するのが、今回の設定のミソになります。
VPC にサブネットを作成
Application Load Balancer は、EC2-VPC(バーチャルプライベートクラウド)のみサポートされています。また、ロードバランサーを作成する時に、2 つ以上のアベイラビリティーゾーンからサブネットを指定する必要がありますので、下準備として、異なるアベイラビリティーゾーンのサブネットを少なくとも2つ作成しておきます。
WEBサーバ(EC2)の設定
ターゲットグループに登録する2台のEC2インスタンスは、先ほど作成した異なるアベイラビリティーゾーンのサブネットに1台づつ配置しておきます。
また、セキュリティグループで、TCP/80番とTCP/2301番を開いておきましょう。
[アクション] → [ネットワーキング] → [セキュリティグループの変更]
EC2インスタンスのWEBサーバは、バーチャルホスト機能を使って、ポート80番とポート2301番で待ち受けするように設定しておきます。下は Apache httpd での設定例です。今回はポートベースのバーチャルホストなので ServerName はなんでもかまいません。
Listen 80 Listen 2301 NameVirtualHost *:80 NameVirtualHost *:2301 <VirtualHost *:80> ServerName localhost DocumentRoot "/var/www/html80" </VirtualHost> <VirtualHost *:2301> ServerName localhost DocumentRoot "/var/www/html2301" </VirtualHost>
ロードバランサーの作成
本題の Application Load Balancer の作成です。設定する過程で、ポート80番で待ち受けするターゲットグループも作成します。
[サービス] → [EC2] → [ロードバランサー] 画面で「ロードバランサーの作成」をクリック
Application Load Balancer を選択し、「次へ」をクリック
ステップ 1: ロードバランサーの設定
適当な名前を入力し、「プロトコル HTTP ポート2301番」のリスナーを追加します。(下に続きます)
(続き)下にスクロールして、先ほど異なるアベイラビリティーゾーンのサブネットを作成したVPCを選択し(+)ボタンをクリックしてサブネットを選択したら、次の手順に進みます。
ステップ 2: セキュリティ設定の構成
今回、HTTPS は使いませんので、そのまま次の手順に進みます。
ステップ 3: セキュリティグループの設定
セキュリティグループの設定で、TCP/80番とTCP/2301番を選択しておきます。
ステップ 4: ルーティングの設定
ここからは、ターゲットグループの設定になります。ヘルスチェックはそのままの設定で問題ありません。
適当な名前を入力し、ポートが「80」であることを確認したら、次の手順に進みます。
【補足】ここでは下図の赤枠部分のポート80番を設定しています。
ステップ 5: ターゲットの登録
ターゲットグループに登録するインスタンスを選択し、ポート「80」のままで「登録済みに追加」をクリックします。
【補足】ここでは下図の赤枠部分、EC2のポート80番を指定しています。
今回はターゲットグループと同じポート80番で登録しましたが、ターゲットグループがポート80番で待ち受けしていても、配下のEC2などインスタンスの待ち受けポートは80番以外でも構いません。また、同じインスタンスを別のポートで複数登録することもできます。例えば、EC2-01をポート80番のほかに、81番、82番、83番でも登録することが可能です。
「登録されたインスタンス」に、インスタンスが追加されたら、次の手順に進みます。
ステップ 6: 確認
設定内容を確認し、間違いがなければ「作成」ボタンをクリックします。
状態が、provisioning から active に変われば、Application Load Balancer の作成完了です。
ポート2301番のターゲットグループの作成
続いて、ポート2301番で待ち受けするターゲットグループを作成します。
[サービス] → [EC2] → [ターゲットグループ] 画面の「ターゲットグループの作成」をクリック
適当なターゲットグループ名を入力し、ポートを「2301」に変更して「作成」をクリックします。
【補足】ここでは下図の赤枠部分のポート2301番を設定しています。
作成したターゲットグループを選択し、「ターゲット」タブ→「編集」ボタンをクリックします。
ターゲットグループに登録するインスタンスを選択し、ポート「2301」のままで「登録済みに追加」をクリックします。
【補足】ここでは下図の赤枠部分、EC2のポート2301番を指定しています。
「登録されたインスタンス」に、インスタンスが追加されたら、「保存」をクリックします。
以上で、ポート2301番のターゲットグループ完成です。ロードバランサーの振り分け設定がまだこれからなので、状態が unused になっていると思います。
ロードバランサーの振り分け設定
ロードバランサーのポート2301番のリスナーから、ポート2301番のターゲットグループへの振り分けを設定します。
[サービス] → [EC2] → [ロードバランサー] 画面で、作成したロードバランサーを選択し、「リスナー」タブ → 2301番のリスナーの「▶︎」をクリックします。
右の方にスクロールして「編集」をクリックします。
ポート2301番のターゲットグループを選択し、「保存」をクリックします。
[サービス] → [EC2] → [ターゲットグループ] 画面で、ポート2301番のターゲットグループを選択し、「ターゲット」タブをクリック、登録されたインスタンスの状態が「healthy」になっていればOKです。
以上で、Application Load Balancer 複数ポートの設定完了です。ロードバランサーのDNS名で接続して、ポート80番とポート2301番のバーチャルホストに振り分けられていることを確認しましょう。
その他 Application Load Balancer で気にしておきたい設定
セッション維持設定
Application Load Balancer デフォルトの設定では、登録したインスタンスの負荷が均等になるように、負荷分散が行われます。この設定の場合、ページを移動すると別のサーバに接続してしまうことがあり、セッションを維持することができません。
ショッピングサイトなど、セッション維持が必要な場合は、維持設定(スティッキーセッション)を有効にしておくことでこれに対応できます。
維持設定を有効にしたいターゲットグループを選択し、「説明」タブをクリックします。
「ロードバランサーによって生成された Cookie の維持を有効化」を選択して「保存」ボタンをクリックすれば、設定完了です。
アイドルタイムアウトの設定
Application Load Balancer のアイドルタイムアウトは、Apache httpd の KeepAliveTimeout に該当するものです。Apache httpd の KeepAliveTimeout のデフォルト値は5秒ですが、Application Load Balancer のアイドルタイムアウトのデフォルト値は60秒と比較的長めに設定されています。
接続のアイドルタイムアウト | AWS Documentation
アイドルタイムアウトを設定したいロードバランサーを選択し、「説明」タブをクリックします。
アイドルタイムアウトの値を入力し「保存」ボタンをクリックすれば、設定完了です。
おわりに
冒頭にも書きましたが Application Load Balancer は、これ以外にも魅力的な機能が満載です、機会があれば HTTP/2 サポートあたりを使ってみたいと思います。
コメント