ALBの加重ルーティングの動きを確認してみた


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

はじめに

新サービスやアプリなど新機能をリリースする際に既存のシステムを停止させずにトラフィックのルーティングによってダウンタイムをなるべく発生させずにリリースを行う、ブルーグリーンデプロイメントやカナリアリリースといった手法があります。
今回は2つのEC2インスタンスへのアクセス時にAWSロードバランサーの一つであるALB(アプリケーションロードバランサー)の加重ルーティング機能を使い、トラフィックが指定した比率で2つのEC2インスタンスへ正しくルーティング行われるかを検証してみたいと思います。

ALBについて

Application Load Balancer(ALB)はElastic Load Balancer(ELB)の一つで、EC2やコンテナなどWebサービスにおける負荷(Load)を分散(Balancing)させるロードバランシングです。サーバーに対しての負荷を軽減し、効率化するために自動的に複数のEC2などに負荷を分散します。

Application Load Balancer は、開放型システム間相互接続 (OSI) モデルの第 7 層であるアプリケーションレイヤーで機能します。ロードバランサーはリクエストを受信すると、優先度順にリスナールールを評価して適用するルールを決定し、ルールアクションのターゲットグループからターゲットを選択します。リスナールールを構成し、アプリケーショントラフィックのコンテンツに基づいて異なるターゲットグループにリクエストをルーティングできます。それぞれのターゲットグループでルーティングは個別に実行され、複数のターゲットグループに登録されているターゲットの場合も同じです。ターゲットグループレベルで使用するルーティングアルゴリズムを設定できます。デフォルトのルーティングアルゴリズムはラウンドロビンです。代わりに最小の未処理のリクエストを指定することもできます。
AWS公式|Application Load Balancer の概要から引用

ALBを使うことで得られるメリットは以下3点を挙げます。

  1. アクセスによってサーバに掛かる負荷を分散させることができる。(高可用性)
  2. セキュリティグループの設定を行うことで、通信の制限(例:HTTP80のみ許可など)やAWS WAF(アプリケーションファイアーウォール)と関連付けることで、よりセキュリティを強化することができる。(堅牢なセキュリティ)
  3. ALBに関連付けられたEC2などのターゲットに対してリクエストを送信し、正常性を定期的にチェックする機能があり、トラブルが発生した際の原因究明に役立つ。(ログ記録)

目的

AWSALBルーティングに関するリスナールールの条件の一つである「forward」を使い、2つのEC2に対して重みを設定し、設定どおりのルーティングが行われるようにするのが今回の目的になります。

構成

file
構成詳細としては、
1.高可用性のマルチAZ構成でパブリックサブネットを作成し、その中にEC2インスタンスを設置する。
2.ALBから直接EC2へ疎通確認を行う。
3.EC2インスタンスには「HelloWorld!EC2 01」、「HelloWorld!EC2 02」と表示されるように構成する。
4.ALBに加重ターゲットグループ機能を使い、指定した比率で各メッセージが表示されるようにする。

構成手順

1.事前準備

・VPC
・パブリックサブネット×2
・インターネットゲートウェイ
・ルートテーブル
を作成します。
AWSコンソールのAWSサービス一覧から「VPC」を選択。
VPCページへ遷移後、「VPCを作成」をクリック。
設定値としては以下になります。

設定項目名 設定値
作成するリソース VPCなど
AZの数 2
パブリックサブネットの数 2
プライベートサブネットの数 0
NATゲートウェイ 無し
VPCエンドポイント 無し
DNSオプションへのチェック DNSホスト名を有効化
DNS解決を有効化

設定完了イメージは下記画像の通りです。
file

2.セキュリティグループの作成

EC2用とALB用のセキュリティグループを作成します。
設定内容としては以下になります。

インスタンス名 セキュリティグループ インバウンドルール
Routing-test-EC2 Routing-test-EC2 HTTP(0.0.0.0/0)
SSH(マイIP)
Routing-test-ALB Routing-test-ALB HTTP(0.0.0.0/0)
SSH(マイIP)

セキュリティグループ作成後、EC2インスタンスを2個立ち上げます。
今回は「Routing-test-EC2-01」、「Routing-test-EC2-02」という名前で作成を行いました。
※EC2インスタンス作成手順については省略いたします。

3.EC2へ表示用メッセージHTML格納

Teraterm経由で作成したEC2へ接続後、Apacheをインストールし、各EC2インスタンスへindex.htmlを格納します。
「Routing-test-EC2-01」には「HelloWorld!EC2 01」、
「Routing-test-EC2-02」には「HelloWorld!EC2 02」と表示されるようindex.htmlを編集し格納しました。
※今回はApacheのインストール手順、格納手順については省略いたします。

4.ターゲットグループの作成

負荷の分散を指定するEC2へ行うためのターゲットグループを作成します。
サービス一覧から「EC2」を選択。
EC2画面に遷移後、サイドメニューから「ターゲットグループ」をクリック。
設定内容は以下になります。

設定項目 設定値
Choose a target type Instances
Target Group name 任意
Protocol/Port HTTP/80
VPC 作成した自分のVPCを選択
Protocol version HTTP1

他の項目についてはデフォルトで問題ありません。

file

ページ下にある「Next」をクリックし、Register targetsページへ遷移します。

VPCに紐づいているEC2インスタンスが2つ表示されているので、どちらか1つだけにチェックを入れ、「Include as pending below」をクリックします。
Review targetsにチェックしたEC2インスタンスが追加されるのを確認後、「Create target group」をクリックし、ターゲットグループの作成を完了させます。

file

完了後、選択していないもう一つのEC2インスタンス用のターゲットグループの作成を行います。
設定内容は同様になります。

5.ロードバランサーの作成

ターゲットグループの作成ができましたのでロードバランサーの作成を行っていきます。
設定内容は以下になります。

設定項目 設定値
ロードバランサーの種類 Application Load Balancer
名前 任意
スキーム Internet-facing
IPアドレスタイプ IPv4
VPC 作成した自分のVPCを選択
マッピングズ 作成したAZすべてにチェックを入れる
サブネット選択欄からそれぞれのサブネットを選択する
セキュリティグループ 作成したALB用のセキュリティグループを選択
リスナールーティング 作成したターゲットグループ1つ

file

作成後、作成したALBの名前をクリックし、詳細画面へ遷移します。
file

Listenersに表示されている「HTTP:80」をクリックします。
file
Listeners detailsにある「Default actions」内に設定したターゲットグループが1つ表示されています。
その下に「Select a target group」と書かれた選択できる欄がありますので、ALB作成時に選択しなかったターゲットグループを追加します。

Weightという項目がどの割合で各ターゲットグループへアクセスを捌くかの比率設定になります。

6.ロードバランサーへ接続する

ALB経由でEC2にアクセスをします。
ALBページから作成したALBの名称をクリックします。
表示された詳細画面にある「DNS name」をコピーします。
ブラウザのアクセス欄にペーストし移動することでEC2インスタンスに設置したindex.htmlの内容が表示されます。
「Routing-test-EC2-01」
file
「Routing-test-EC2-02」
file

これで構成が完了しました。

検証

今回は、リスナールールのweightの比率を変更することで、10回EC2へアクセスする際のルーティング挙動を確認します。
AWS Cloudshell上で以下のコマンドを入力します。

for X in `seq 10`; do curl -so -i /dev/null -w "" ALBのDNS name/; done

①「Routing-test-EC2-01」のweightを5、
「Routing-test-EC2-02」のweightを5とした場合
file

②「Routing-test-EC2-01」のweightを8、
「Routing-test-EC2-02」のweightを2とした場合
file

③「Routing-test-EC2-01」のweightを1、
「Routing-test-EC2-02」のweightを9とした場合
file

設定した通りの比率でアクセスが行われていることが確認できました。

まとめ

リスナールールを設定することで、各EC2インスタンスへ偏りのない均等なルーティングや接続させたいインスタンスへのルーティングが可能になることが改めて確認できました。

Last modified: 2023-04-14

Author