【AWS】ロードバランサーを配置して複数のEC2インスタンスに負荷分散してみる

AWS

以前、AWS環境上にVPCを構築し、EC2を利用して踏み台サーバーとWEBサーバを配置しました。
<参考記事>
【AWS】EC2を利用して仮想サーバーを構築(WEBサーバー編)

この時は1台のWEBサーバのみを作成し、踏み台サーバからアクセス可能な形で作成しました。
(まだインターネットに向けての公開はしていない状態)
このサーバ上にWEBコンテンツを配置することで、インターネット上からアクセスすることが可能となります。
今回は、この環境上にロードバランサーを配置しつつ、ブラウザからWEBアプリを閲覧できるようにしたいと思います。

1.ロードバランサーとは

ロードバランサーを配置する目的としては、1台のWEBサーバではリクエストを捌き切れなくなった場合に、複数のWEBサーバに均等にアクセスを振り分けることにあります。

リクエストが少ないうちはいいですが、多くなってくると、1台だけでは処理待ちが発生してしまいますからね。
コンビニやスーパーのレジと一緒で、1か所だけレジが稼働している場合、お客さんが複数人並んでいると、待ち時間が長くなりますよね。ただし、レジが複数台稼働していると、その分、待ち時間も少なくなります。

これをWEBサーバに置き換えると、複数のWEBサーバを同時に稼働させておき、アクセスが多くなった場合に各WEBサーバにリクエストを振り分けることで、処理待ちが短くなります。

このリクエスト振り分け処理が、ロードバランサーの主な仕事です。

2.AWSで利用できるロードバランサー

AWSでは、「Elastic Load Balancing」(ELB)というサービスでロードバランサーとしての機能が提供されています。
ELBの中でも更に機能が細分化されていますが、今回はHTTP/HTTPSによるアクセスの分散に特化した「Application Load Balancer」(ALB)を使用します。

因みに、他にも以下のロードバランサーが用意されていますが、今回は使用しません。
・Network Load Balancer:ゲームやチャットといった、リアルタイム双方向通信の分散に利用
・Gateway Load Balancer:AWS以外のサービスでのセキュアなインフラ環境構築に利用

ALBの配置イメージは、以下の図の通りとなります。太い赤枠の部分がALBです。

インターネットからのリクエストをALBが判断して、それぞれのEC2インスタンス(WEBサーバ)に処理が振り分けられるという訳です。

因みに、他の部分の構築は以下の記事を順に参照ください。

【AWS】仮想ネットワークを作成してみる(VPC編)
【AWS】仮想ネットワークを作成してみる(サブネット編)
【AWS】仮想ネットワークを作成してみる(インターネットゲートウェイ編)
【AWS】仮想ネットワークを作成してみる(NATゲートウェイ編)
【AWS】仮想ネットワークを作成してみる(ルートテーブル編)
・【AWS】仮想ネットワークを作成してみる(セキュリティグループ編)
【AWS】EC2を利用して仮想サーバーを構築(踏み台サーバー編)
【AWS】EC2を利用して仮想サーバーを構築(WEBサーバー編)
※因みに、WEBサーバ編については、リンク先の記事ではAZ2側のPrivateサブネット内にはEC2のWEBサーバを作成していませんので、準備の際はAZ1側を参考にして、同じように用意してください。

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

① ロードバランサー画面への移動

EC2のダッシュボード画面から、サイドバーの「ロードバランサー」を選択すると、ロードバランサー画面に移動できます。
この時点では、まだロードバランサーを作成していませんので、一覧には何もない状態です。
そこで、右上の「ロードバランサーの作成」をクリックしましょう。

② ロードバランサータイプの選択

次に選択するのは、ロードバランサーの種類です。
前述の通り、今回はHTTP/HTTPSによるアクセスの分散に特化した「Application Load Balancer」(ALB)を使用しますので、ALBの「作成」をクリックしてください。

③ ロードバランサーの基本設定

ここからは、ロードバランサーの中身に関する各種設定となります。

まずはロードバランサー名指定ですが、今回はサンプルとなりますので、名前は「test-elb」とります。
それ以外は、以下を選択しましょう。
・スキーム:インターネット向け
・IPアドレスタイプ:IPv4

④ ネットワークマッピングの設定

次は「ネットワークマッピング」の設定になります。
ここでは、ロードバランサーが使用するアベイラビリティゾーン(AZ)
サブネットを指定します。

画面の通り、VPCは「test-vpc」、アベイラビリティゾーンは「ap-northeast-1a」「ap-northeast-1c」を選択します。
ここで注意しなければいけないのですが、アベイラビリティゾーンを選択後のサブネット設定については、インターネットゲートウェイへの経路があるサブネットを設定する必要があります。
今回構築したVPCでは、Publicサブネットが対象となりますので、それぞれ「test-subnet-public01」「test-subnet-public02」を指定します。

⑤ セキュリティグループの設定

セキュリティグループについては、こちらの記事で作成した「test-sec-grp-load-bal」を追加で選択しましょう。
このセキュリティグループは、インバウンドルールとしてHTTP/HTTPSの通信を許可しています。

⑥ リスナーとルーティングの設定

次は「ターゲットグループ」の設定になるのですが、この時点ではターゲットグループがまだ作成されていません

上記画面の通り、「ターゲットグループの作成」を選択しましょう。
クリックすると、ターゲットグループの基本設定画面に移行します。

ターゲットタイプについては、「インスタンス」を選択します。
ターゲットグループ名は、今回はサンプルのため「test-tg」とします。

プロトコル:ポートについては、今回はデフォルトのまま「HTTP/80」と設定します。

それ以外は、以下を選択しましょう。
・IPアドレスタイプ:IPv4
・VPC:test-vpc

プロトコルバージョン:HTTP1

⑦ ヘルスチェックの設定

「ヘルスチェック」については、ロードバランサーが各WEBサーバの動作状況を確認するためのパスを指定する箇所となります。
指定したパスへのリクエストが指定した回数分失敗した場合、ロードバランサーはそのWEBサーバを切り離します。
(振り分け先から除外する)
今回はデフォルト設定のままとします。

ここまでの設定が終わりましたら、「次へ」をクリックしましょう。

⑧ ターゲットの登録

前画面で「次へ」をクリックすると、「ターゲットを登録」画面に移行します。

ここでは、ロードバランサーがターゲットとするEC2インスタンスを選択します。
今回はWEBサーバがターゲットとなりますので、「test-web-server01」「test-web-server02」にチェックを入れます。


チェック後は、「保留中として以下を含める」をクリックしてください。

クリック後は「ターゲットを確認」の欄にチェックしたインスタンスが追加されます。
追加されたら、「ターゲットグループの作成」をクリックしてください。

このような画面が表示されたら、ターゲットグループの作成成功です。
成功したら、ALBの作成画面に戻りましょう。

「リスナーとルーティング」欄にて更新ボタンをクリックすると、先ほど作成したターゲットグループ「test-tg」が選択可能となっていますので、選択しましょう。

⑨ 確認

ターゲットグループ選択後は、画面の一番下までスクロールし、「ロードバランサーの作成」をクリックしましょう。

このような画面が表示されたら、ロードバランサーの作成成功です。

3.ロードバランサーの動作確認

① WEBサーバへのSSH接続

ここまででロードバランサーの作成は完了しましたので、さっそく動作確認を行ってみましょう。

こちらの記事でEC2接続確認を行ったのと同様、PowerShellを起動して各WEBサーバに接続します。
※参考記事ではwebserver01しか作成していないので、今回はconfig
中身もwebserver02まで作成してください。

Host fumidai
Hostname XXX.XXX.XXX.XXX
User ec2-user
IdentityFile ~/.ssh/key-test-user.pem

Host webserver01
Hostname XXX.XXX.XXX.XXX
User ec2-user
IdentityFile ~/.ssh/key-test-user.pem
ProxyCommand ssh.exe fumidai -W %h:%p

Host webserver02
Hostname XXX.XXX.XXX.XXX
User ec2-user
IdentityFile ~/.ssh/key-test-user.pem
ProxyCommand ssh.exe fumidai -W %h:%p

configファイルをユーザーフォルダ内に作成した「.ssh」フォルダ内に配置し、

PS C:\Users\testuser> ssh webserver01
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ ]
PS C:\Users\testuser> ssh webserver02
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ ]

こんな感じでWEBサーバにアクセスします。

② Apacheをインストールし、HTTPサーバを起動

WEBサーバ上でHTTPサーバを起動させる場合は「Apache」などをインストールして起動させるのが一般的です。
今回もそれに倣ってHTTPサーバを起動させましょう。

インストールは、yumを使用して行います。
まずはyumのアップデートのため、[sudo yum update]のコマンドを実行してください。

[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ sudo yum update
Last metadata expiration check: 2:39:54 ago on Tue Aug 13 02:36:26 2024.
Dependencies resolved.
Nothing to do.
Complete!
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$

以下のようにメッセージが表示されればアップデート成功です。
続いて、Apacheインストールのため、[sudo yum install httpd]のコマンドを実行してください。

[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ sudo yum install httpd
Last metadata expiration check: 2:40:15 ago on Tue Aug 13 02:36:26 2024.
Dependencies resolved.
========================================================================================================================
 Package                         Architecture       Version                               Repository               Size
========================================================================================================================
Installing:
 httpd                           x86_64             2.4.62-1.amzn2023                     amazonlinux              48 k
Installing dependencies:
 apr                             x86_64             1.7.2-2.amzn2023.0.2                  amazonlinux             129 k
 apr-util                        x86_64             1.6.3-1.amzn2023.0.1                  amazonlinux              98 k
 generic-logos-httpd             noarch             18.0.0-12.amzn2023.0.3                amazonlinux              19 k
 httpd-core                      x86_64             2.4.62-1.amzn2023                     amazonlinux             1.4 M
 httpd-filesystem                noarch             2.4.62-1.amzn2023                     amazonlinux              14 k
 httpd-tools                     x86_64             2.4.62-1.amzn2023                     amazonlinux              81 k
 libbrotli                       x86_64             1.0.9-4.amzn2023.0.2                  amazonlinux             315 k
 mailcap                         noarch             2.1.49-3.amzn2023.0.3                 amazonlinux              33 k
Installing weak dependencies:
 apr-util-openssl                x86_64             1.6.3-1.amzn2023.0.1                  amazonlinux              17 k
 mod_http2                       x86_64             2.0.27-1.amzn2023.0.3                 amazonlinux             166 k
 mod_lua                         x86_64             2.4.62-1.amzn2023                     amazonlinux              61 k

Transaction Summary
========================================================================================================================
Install  12 Packages

Total download size: 2.3 M
Installed size: 6.9 M
Is this ok [y/N]: y
Downloading Packages:
(1/12): apr-util-openssl-1.6.3-1.amzn2023.0.1.x86_64.rpm                                249 kB/s |  17 kB     00:00
(2/12): apr-util-1.6.3-1.amzn2023.0.1.x86_64.rpm                                        1.2 MB/s |  98 kB     00:00
(3/12): apr-1.7.2-2.amzn2023.0.2.x86_64.rpm                                             1.4 MB/s | 129 kB     00:00
(4/12): generic-logos-httpd-18.0.0-12.amzn2023.0.3.noarch.rpm                           753 kB/s |  19 kB     00:00
(5/12): httpd-2.4.62-1.amzn2023.x86_64.rpm                                              2.0 MB/s |  48 kB     00:00
(6/12): httpd-tools-2.4.62-1.amzn2023.x86_64.rpm                                        3.3 MB/s |  81 kB     00:00
(7/12): httpd-filesystem-2.4.62-1.amzn2023.noarch.rpm                                   237 kB/s |  14 kB     00:00
(8/12): httpd-core-2.4.62-1.amzn2023.x86_64.rpm                                          16 MB/s | 1.4 MB     00:00
(9/12): mailcap-2.1.49-3.amzn2023.0.3.noarch.rpm                                        1.2 MB/s |  33 kB     00:00
(10/12): libbrotli-1.0.9-4.amzn2023.0.2.x86_64.rpm                                      5.4 MB/s | 315 kB     00:00
(11/12): mod_lua-2.4.62-1.amzn2023.x86_64.rpm                                           2.6 MB/s |  61 kB     00:00
(12/12): mod_http2-2.0.27-1.amzn2023.0.3.x86_64.rpm                                     5.4 MB/s | 166 kB     00:00
------------------------------------------------------------------------------------------------------------------------
Total                                                                                   8.6 MB/s | 2.3 MB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                1/1
  Installing       : apr-1.7.2-2.amzn2023.0.2.x86_64                                                               1/12
  Installing       : apr-util-openssl-1.6.3-1.amzn2023.0.1.x86_64                                                  2/12
  Installing       : apr-util-1.6.3-1.amzn2023.0.1.x86_64                                                          3/12
  Installing       : mailcap-2.1.49-3.amzn2023.0.3.noarch                                                          4/12
  Installing       : httpd-tools-2.4.62-1.amzn2023.x86_64                                                          5/12
  Installing       : libbrotli-1.0.9-4.amzn2023.0.2.x86_64                                                         6/12
  Running scriptlet: httpd-filesystem-2.4.62-1.amzn2023.noarch                                                     7/12
  Installing       : httpd-filesystem-2.4.62-1.amzn2023.noarch                                                     7/12
  Installing       : httpd-core-2.4.62-1.amzn2023.x86_64                                                           8/12
  Installing       : mod_http2-2.0.27-1.amzn2023.0.3.x86_64                                                        9/12
  Installing       : mod_lua-2.4.62-1.amzn2023.x86_64                                                             10/12
  Installing       : generic-logos-httpd-18.0.0-12.amzn2023.0.3.noarch                                            11/12
  Installing       : httpd-2.4.62-1.amzn2023.x86_64                                                               12/12
  Running scriptlet: httpd-2.4.62-1.amzn2023.x86_64                                                               12/12
  Verifying        : apr-1.7.2-2.amzn2023.0.2.x86_64                                                               1/12
  Verifying        : apr-util-1.6.3-1.amzn2023.0.1.x86_64                                                          2/12
  Verifying        : apr-util-openssl-1.6.3-1.amzn2023.0.1.x86_64                                                  3/12
  Verifying        : generic-logos-httpd-18.0.0-12.amzn2023.0.3.noarch                                             4/12
  Verifying        : httpd-2.4.62-1.amzn2023.x86_64                                                                5/12
  Verifying        : httpd-core-2.4.62-1.amzn2023.x86_64                                                           6/12
  Verifying        : httpd-filesystem-2.4.62-1.amzn2023.noarch                                                     7/12
  Verifying        : httpd-tools-2.4.62-1.amzn2023.x86_64                                                          8/12
  Verifying        : libbrotli-1.0.9-4.amzn2023.0.2.x86_64                                                         9/12
  Verifying        : mailcap-2.1.49-3.amzn2023.0.3.noarch                                                         10/12
  Verifying        : mod_http2-2.0.27-1.amzn2023.0.3.x86_64                                                       11/12
  Verifying        : mod_lua-2.4.62-1.amzn2023.x86_64                                                             12/12

Installed:
  apr-1.7.2-2.amzn2023.0.2.x86_64                          apr-util-1.6.3-1.amzn2023.0.1.x86_64
  apr-util-openssl-1.6.3-1.amzn2023.0.1.x86_64             generic-logos-httpd-18.0.0-12.amzn2023.0.3.noarch
  httpd-2.4.62-1.amzn2023.x86_64                           httpd-core-2.4.62-1.amzn2023.x86_64
  httpd-filesystem-2.4.62-1.amzn2023.noarch                httpd-tools-2.4.62-1.amzn2023.x86_64
  libbrotli-1.0.9-4.amzn2023.0.2.x86_64                    mailcap-2.1.49-3.amzn2023.0.3.noarch
  mod_http2-2.0.27-1.amzn2023.0.3.x86_64                   mod_lua-2.4.62-1.amzn2023.x86_64

Complete!
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$

以下のようにメッセージが表示されれば、Apacheのインストール成功です。
インストール後は、[sudo systemctl start httpd.service]のコマンドで起動させます。
※コマンドライン上には何もでてきません

[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ sudo systemctl start httpd.service
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$

③ サンプルHTML作成

Apacheの起動後は「/var/www/html」ディレクトリが自動で作成されます。
ここがデフォルトのヘルスチェックパスとなりますので、ここにindex.htmlを作成しましょう。
※ALBのターゲットグループ作成の際、ヘルスチェックをデフォルト(”/”)としたため、「/var/www/html」内のindex.htmlをアクセスしにいきます。

作成はviエディタで行います。
なお、ec2-userでは上記ディレクトリにファイル作成できませんので、
sudo vi index.html」をコマンド入力しましょう。
(※webserver01、02両方行ってください)

内容は以下の通り、いつもお馴染みの「hello world!」です。
動作確認のみなので、簡単で構いません。

<html><body>hello world! server01</body></html>
<html><body>hello world! server02</body></html>

後ほどロードバランサーの動作確認を行う際、どちらにアクセスされたかが分かるように、webserver0102敢えてHTMLの内容は変えておきます。
作成後は、lsコマンドでファイルの存在確認を行います。

[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ ls
index.html

index.htmlを作成後、しばらくするとターゲットグループ内に指定したターゲット(EC2インスタンス)のヘルスステータスが「Healthy」に変わります。
EC2ターゲットグループ画面で確認できます)
これで、WEBサーバへのルーティングが完了しました。

④ 動作確認

ルーティングが完了したら、作成したロードバランサーのDSN名をコピーし、ブラウザでアクセスしてみて下さい。

こんな感じで、ブラウザからWEBサーバに、ロードバランサーを経由してアクセス成功しました。
因みに、ブラウザを何回か更新すると、

このように、webserver02にもアクセスできました。
ロードバランサーの振り分け機能がちゃんと機能していますね。

まとめ

今回、Privateサブネット内のEC2インスタンス(WEBサーバ)に、ロードバランサー経由でアクセスしてみました。
EC2インスタンス(WEBサーバ)に直接アクセスするのはセキュリティ上問題がありますが、ロードバランサーを経由させてアクセスさせることで、セキュリティを考慮した形にもなり、更に負荷分散もできます。
今回のケースは簡単なパターンでしたので、これを応用して様々なシステムを構築していただければと思います。

因みに、今回はHTTPでの接続でしたが、HTTPSでの接続となるとまた設定方法が変わってきますので、それはまた別の機会に実施してみます。
(今回はここまで)

お読みいただき、有難うございました!

コメント

タイトルとURLをコピーしました