ALB(Application Load Balancer)の分散テストをやってみた【AWS】

今回は、AWSの ALB(Application Load Balancer) を使って、負荷分散の動作確認を行うシンプルなテスト構成を紹介します。
記事の目次
テスト構成概要
テスト構成は以下のようなシンプルな構成です。
・VPC・IGW ・サブネットは作成済み
・パブリックサブネットに EC2(Apacheインストール済)を2台配置
・その2台を ALB(HTTP)で分散
※EC2自体はパブリックである必要はありませんが、SSH接続などが楽になるため、今回はパブリックIPを割り当てています。

1. EC2にApacheをインストールして動作確認

まずは1台目の EC2(以後 web1 と呼びます)を作成します。
OS は Amazon Linux 2 を使用。
下記記事を参考に作成してください。
画面が表示されるまで確認しましょう。

2. web1をAMI化して、web2を複製する

次に、web1 をベースにしたAMIを作成して、2台目の EC2(web2)を起動します。
2-1. AMIの作成手順
- EC2 ダッシュボード へ移動し先ほど作成したEC2にチェック
- アクション>イメージとテンプレート>イメージを作成 をクリック

- イメージ名を任意で入力し「イメージを作成」をクリック

2-2. AMIからインスタンスを起動
左メニューの「AMI」から、先ほど作成したAMIを選択し「AMIからインスタンスを起動」をクリック。

ネットワーク設定では、web1と同じVPCを選択することを忘れずに。パブリックIPも割り当てておきましょう。

試しに作成したweb2EC2のパブリックIPv4アドレスでアクセスしてみます。

無事アクセスできました。

ただし、このままではALBテストの時にどちらのEC2に接続できたかわからないので、先ほど作成したEC2(web2)は 表示する文言を変更します。
3. web2の表示文言を変更
EC2(web2)にSSH接続します。
(ユーザー名はec2-user、鍵はAMIを復元するときに指定した鍵です。)
#sshコマンド
ssh -i <指定したキーペア> ec2-user@<web2のパブリックIP>
# HTMLファイルを編集
echo "<h1>This is web2</h1>" | sudo tee /var/www/html/index.html
再度 web2 のIPでアクセスし、This is web2 と表示されればOKです。

4. ALB作成

次にALBの作成に入っていきます。
ALB本体の作成の前に、まずはターゲットグループを作成します。
ターゲットグループの作成
EC2 ダッシュボード → 左メニュー「ターゲットグループ」→「作成」

ターゲットグループの設定値を下記のように設定します。
基本はデフォルトでOKですが、VPCだけさきほど作成したEC2のVPCを選択するようにしてください。

「ターゲットを登録」で先ほど作成したEC2にチェックを入れ「保留中として以下を含める」をクリック
※EC2が起動中でないと表示されないため、表示されない方はEC2の起動状態を確認してください。

すると下記のように「ターゲットを確認」でEC2が保留中として追加されます。
問題なければ「ターゲットグループの作成」をクリック

すると正常に作成されたのを確認できます。

ALBの作成
ターゲットグループの作成を終了しましたので、いよいよALB作成に入っていきます。
EC2ダッシュボード → 左メニュー「ロードバランサー」→「作成」

今回はHTTP(ポート80)での通信を行いたいため、ALBを選択します。

下記のように設定値を入力

ネットワークマッピングは下記のように選択してください。
サブネットはEC2の作成したサブネットを指定します。

セキュリティグループはEC2と同様のものを選択します。(ポート80の通信が許可されているもの)
ターゲットグループは先ほど作成した「ALB-test」を選択。

作成完了しました。 ステータスがアクティブになるまで待機します。
ALBがアクティブになったら、「DNS名(例:my-alb-123456789.ap-northeast-1.elb.amazonaws.com)」をコピーしてブラウザでアクセス。

リロードを繰り返すと、It works! / This is web2 がランダムに切り替わって表示されることを確認できます。
これが、ALBがリクエストを負荷分散している証拠です!


無事表示されました。
参考:セキュリティグループについて
今回のテストでは簡易化のため、EC2もALBも同じセキュリティグループを使用し、全てのHTTP通信を許可しています。
本来は以下のような構成がセキュアです:
- ALBのSG:インターネットからのHTTP(ポート80)のみ許可
- EC2のSG:ALBのSGからのHTTPのみ許可
- EC2側にSSHを許可するなら、特定IPからのみ許可
今回は ALB の基本的な分散動作を確認しました。皆様の参考になれば幸いです。