あるけみーの小屋

趣味の話とか色々

ALBを使ったパスベースルーティング

みなさん、AWSしてますか?(流行らせたい)

 

今回はELB編となります。

 

前提条件(実際に手を動かして見たい方)

AWSアカウントを所持していること

・事前にVPCAZが異なるサブネットを2つ作成済みであること

・上記サブネットにそれぞれ1台ずつのEC2インスタンスを起動していること

ELBとは 

ELB(Elastic Load Balancing)はトラフィックを複数のEC2などに分散させるサービスです。昔は"ELB"というタイプしかなかったようですが、現在は「ALB」「NLB」「CLB」そして「GLB」の4タイプがあります。GLBについてはつい最近使えるようになったサービスらしく、私も存在を知りませんでした。(2020年11月にGAとなったようです。)

※GA: General Availability. 一般提供のこと。

 

ALB、NLB、CLBの違いについてはこちらの記事が大変参考になります。

qiita.com

GLBについては公式の説明がありますが。。。うーむ分からん

aws.amazon.com

それぞれのユースケースについて整理が必要ですね。

まずはALBを作成してみる

まずはAWSコンソールからEC2を選択します。EC2はコンピューティングに分類されています。

f:id:fieldpaddy:20210420130924p:plain

 

左側のメニューバーに「ロードバランサー」の項目があるのでそれを選択。

f:id:fieldpaddy:20210420131248p:plain

 

画面左上の「ロードバランサーの作成」を選択。

f:id:fieldpaddy:20210420131814p:plain

 

今回はALBを作成するため一番左の「ALB」を選択。

f:id:fieldpaddy:20210420132214p:plain

 

手順1:ロードバランサーの設定

まずはロードバランサーの名前を入力します。スキームはインターネット向けと内部とありますが、違いはクライアント側からロードバランサーの存在が見えるか(パブリックIPアドレスが割り当てられるか否か)です。なお、ALBではパブリックIPアドレス動的になるので注意。IPアドレスはそのまま、リスナーはHTTPのままやってみます。(商用環境ではHTTPSのみ設定することが望ましい)

f:id:fieldpaddy:20210420132426p:plain

下の方へ行くとアベイラビリティゾーンの設定が必要なのでVPCAZが異なるサブネットを2つ選択します。ALBはAWS側で冗長を取りますが、その際AZを2つ以上指定しなければAZ障害時にサービスが利用できないということにもなりますので、ここで2つのサブネットを選択します。ここの選択が完了したら次の手順に移ります。

f:id:fieldpaddy:20210420135019p:plain

 

手順2:セキュリティ設定の構成

次の項目ですが、前項でリスナーにHTTPを選んだ場合は下記画面が表示されます。HTTPSを選んだ場合はSSL証明書をアップロードする画面になりますが、今回はそのまま次へ。ちなみにAWSではCertification Managerという無料で証明書を発行できるサービスがあるのでご活用ください。(証明書が無料ってすごいんですよ!)

f:id:fieldpaddy:20210420135712p:plain

 

手順3:セキュリティグループの設定

前回の記事でも設定したものです。ここではHTTP80が許可されていればOKです。しつこいですがセキュリティがガバガバ設定なので注意してください。不安であればソースをマイIPにして自分しかアクセスできないようにしてください。

f:id:fieldpaddy:20210420142930p:plain

 

手順4:ルーティングの設定

ここではELBからどこへトラヒックを流すかの設定です。ここでは新しくターゲットグループを作成するため、名前だけ入力して次へ進みます。

f:id:fieldpaddy:20210420143335p:plain

 

手順5:ターゲットの登録

手順4で作成したターゲットグループにEC2を割り当てていきます。登録するEC2にチェックを入れたら「登録済みに追加」を押します。そして確認へ。

f:id:fieldpaddy:20210420144433p:plain

f:id:fieldpaddy:20210420144445p:plain

 

手順6:確認

内容に問題がなければ作成を押して完了です。

f:id:fieldpaddy:20210420144706p:plain

 

負荷分散の確認

さて動作確認です。確認のためにEC2に接続して下記コマンドを順に実行します。

①rootユーザに切り替え

sudo su -

yumのアップデート
yum -y update

Apacheのインストール

yum -y install httpd

Apacheの起動

systemctl start httpd

Apacheの起動確認(Activeになっていることを確認)

systemctl status httpd

f:id:fieldpaddy:20210420145946p:plain

ここまででApacheの起動が完了しました。そしてWebページを表示するためのファイルを作成するため、下記コマンドを順に実行します。

⑥ファイルを格納するためのフォルダへ移動

cd /var/www/html

⑦ファイルを作成

touch index.html

⑧ファイルを編集(1台目であることが分かれば中身の記述は自由です。)

vi index.html

f:id:fieldpaddy:20210420154825p:plain

①〜⑧の手順を2台目の方にも実施します。

さてここまでの設定が完了したら、ALBで負荷分散されていることを確認していきます。ロードバランサーの画面で、作成したロードバランサーにチェックを入れ、下の方に「DNS名」と記載がある箇所があるのでその文字列をコピーしてブラウザのURLバーに貼り付けてEnterを押してみましょう。

f:id:fieldpaddy:20210420160819p:plain

 

初回は2台目にルーティングされました。

f:id:fieldpaddy:20210420161030p:plain

何回か更新ボタンを押すと、1台目を表すメッセージが表示されたり、とにかく負荷分散ができていることが確認できると思います。

ということでここまでの構成振り返り。

f:id:fieldpaddy:20210420162046p:plain

今回はEC2をいずれもPublicサブネットに置いていますが、EC2をPrivateサブネットに置く構成がセキュリティ的にも好ましいです。

 

ALBのパスベースルーティングについて

ここからタイトルの内容。ALBで負荷分散ができることは確認しましたが、ALBには他の使い方もあります。パスベースルーティングです。本やWebサイトによってはコンテントベースルーティングと呼ぶこともあるそうです。

これはURLの中に含まれる文字列に応じてサーバに振り分ける機能です。

例えばURLのパスに/sampleAが含まれていたら1台目のEC2に、/sampleBが含まれていたら2台目の方に振り分けられる、といった機能です。

f:id:fieldpaddy:20210420162721p:plain

 

まずは先程作成したターゲットグループから2台目を登録解除します。

f:id:fieldpaddy:20210420163323p:plain

f:id:fieldpaddy:20210420163415p:plain

 

この間にもう一つターゲットグループを作成していきます。右上のオレンジのボタンを押して作成していきます。UIは異なりますが、ALBを作成した時と同じ内容を入力します。名前は既存のものと区別がつくようにします。

f:id:fieldpaddy:20210420163848p:plain

 

そしてターゲットの登録には先程登録解除した2台目のEC2を登録します。

f:id:fieldpaddy:20210420164015p:plain

そしてターゲットグループの作成。

 

ロードバランサーに戻り、作成したALBにチェックし、画面下部のリスナータブを選択。その中にルールの表示/編集というのがあるのでそれをクリック。

 

f:id:fieldpaddy:20210420164344p:plain

 

画面上部の「+」を押して、そのあと表示される「ルールの挿入」をクリック。

f:id:fieldpaddy:20210420164542p:plain

 

今回はパスにsampleAが含まれていたら1台目に振り分ける設定をするのでIFのところにはsampleAを入力。THENを選ぶときは転送先を選択後、1台目のEC2が含まれているターゲットグループを指定。

f:id:fieldpaddy:20210420171051p:plain



 

同様にsampleB分も設定します。一度保存を押したあと、ルールの挿入(どちらでも可)を押して設定していきます。察しの良い方は気付くかもしれませんが、これらのルールは上から順に判定されていきます。

f:id:fieldpaddy:20210420171129p:plain

 

このように設定できたら完了です。

f:id:fieldpaddy:20210420171204p:plain

これでターゲットグループの設定は完了です。このままですとsampleAとsampleB配下にindex.htmlがないのでエラーとなりますのでそれぞれのEC2インスタンスに接続し、下記コマンドを実行します。

①rディレクトリ移動
cd /var/www/html

②sampleAまたはsampleB用のフォルダを作成(1台目にsampleA、2台目にsampleBのフォルダを作成してください。)

mkdir sampleA (またはmkdir sampleB)

③作ったフォルダにindex.htmlをコピー

cp index.html sampleA/ (またはcp index.html sampleB/)

 

これで準備完了です。ブラウザで確認してみましょう。

まず、ロードバランサーDNS名をURLブラウザに貼り付け、その後ろに、/sampleAと入力してEnterをします。

f:id:fieldpaddy:20210420171831p:plain

(sampleAの後に「/」まで入れましょう!)

f:id:fieldpaddy:20210420171905p:plain

すると、1台目のEC2にルーティングされていることがわかります。この状態で更新ボタンを押しても2台目にルーティングされることはありません。

sampleBの方でも試してみましょう。

f:id:fieldpaddy:20210420172200p:plain

f:id:fieldpaddy:20210420172212p:plain

はい、こちらは2台目の方にしかルーティングされません。

 

メリット

ALBは主に負荷分散目的で使われることが多いですが、パスベースルーティングの使い道としては1台のALB配下に複数の種類のEC2をぶら下げることができます。本来機能の数だけALBを用意しなければならないところを1台で済むようになります。これは管理工数の削減であったり、ALB自体のコスト削減に繋がったりもします。

(すみません、このパターンで運用している案件を経験したことがないので当たり障りのないことしか言えません。)

 

その他の機能

ELB自体には紹介した機能以外にも様々な特徴があります。気になる方は下記ワードで調べると良いと思います。

・Connection Draining

・スティッキーセッション

 

それでは今回はここまで!