以前、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>後ほどロードバランサーの動作確認を行う際、どちらにアクセスされたかが分かるように、webserver01と02で敢えてHTMLの内容は変えておきます。
作成後は、lsコマンドでファイルの存在確認を行います。
[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ ls
index.htmlindex.htmlを作成後、しばらくするとターゲットグループ内に指定したターゲット(EC2インスタンス)のヘルスステータスが「Healthy」に変わります。
(EC2のターゲットグループ画面で確認できます)
これで、WEBサーバへのルーティングが完了しました。
④ 動作確認

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

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

このように、webserver02にもアクセスできました。
ロードバランサーの振り分け機能がちゃんと機能していますね。
まとめ
今回、Privateサブネット内のEC2インスタンス(WEBサーバ)に、ロードバランサー経由でアクセスしてみました。
EC2インスタンス(WEBサーバ)に直接アクセスするのはセキュリティ上問題がありますが、ロードバランサーを経由させてアクセスさせることで、セキュリティを考慮した形にもなり、更に負荷分散もできます。
今回のケースは簡単なパターンでしたので、これを応用して様々なシステムを構築していただければと思います。
因みに、今回はHTTPでの接続でしたが、HTTPSでの接続となるとまた設定方法が変わってきますので、それはまた別の機会に実施してみます。
(今回はここまで)
お読みいただき、有難うございました!


コメント