📝

ALBのパスベースルーティングをやってみた

2021/11/12に公開

ALBにはパスに基づいてリクエストを振り分ける機能があり、巷では「パスベースルーティング」と呼ばれています。

Application Load Balancer では、URL に基づいてリクエストをターゲットグループに転送するルールを持つリスナーを作成できます。
Application Load Balancer でのパスベースのルーティングを実現するにはどうすればよいですか?

今回はこのパスベースルーティングを試してみたいと思います。

構成図

temp-Pass.drawio.png

・パブリックサブネットを2つ用意
・ALBをパブリックサブネットに配置
・各サブネットに1台ずつEC2インスタンスを配置
/1a/1cでパスごとにリクエストをそれぞれのEC2インスタンスにルーティング

EC2はプライベートサブネットにあった方が安全ですが、今回は検証なのですべてパブリックサブネットに構築します。

前提

・VPCは10.0.0.0/16で作成済み
・パブリックサブネットは10.0.1.0/2410.0.2.0/24で作成済み

1. EC2インスタンス構築

まずはEC2インスタンスを構築するため、EC2コンソールに移動します。
image.png

EC2ダッシュボードから「インスタンスを起動」をクリックします。
image.png

今回はAmazon Linux 2 AMI (HVM)のAMIを選択します。
image.png

インスタンスタイプは検証なので「t2.micro」を選択します。
image.png

詳細設定は以下の様に設定しています。
・VPC:作成済みのVPC
・サブネット:作成済みのパブリックサブネット
・自動割り当てパブリックIP:有効
・キャパシティーの予約:なし (余計な課金を抑えるため)
・IAMロール:EC2インスタンス用のロール(なくてもOK)
 あとでSSMセッションマネージャーで接続する用なので、Tera Termなどで接続する場合は不要です。
 アタッチしているポリシーは「AmazonSSMManagedInstanceCore」です。
・ユーザーデータ:以下のコマンドを貼り付け

#!/bin/bash
sudo su
yum update -y
yum -y install httpd
chkconfig httpd on
service httpd start

image.png
image.png

ストレージの設定はデフォルトのままでOKです。
image.png

タグはキーに「Name」、値に「Web-1a」と入力し、識別しやすくしておきます。
image.png

セキュリティグループは新規作成でも既存のグループでも良いです。
必要なルールは、HTTPでマイIPとALBからのアクセスを許可、SSH接続する場合はSSHでマイIPを許可ぐらいです。
image.png

確認画面で設定を確認して「起動」をクリックします。
image.png

今回はセッションマネージャーで接続するため、キーペアはなしでインスタンスを作成します。
Tera Termなどで接続する場合はキーペアが必要です。
その場合の接続方法は公式ドキュメントなどで調べればすぐわかると思いますので、そちらにお任せします。
image.png

これで片方のAZに1台のEC2インスタンスを起動できました。
試しにパブリックIPでアクセスしてみると、Apacheのデフォルトページが表示されるはずです。
表示されない場合は以下を確認してください。
・EC2起動時の詳細設定でパブリックサブネットを選択したか
・EC2起動時の詳細設定でユーザーデータを貼り付けたか
・EC2のセキュリティグループでHTTPをマイIPから許可しているか
image.png

今回はパスによって表示内容を切り替えたいので、インスタンスの中身をいじります。
セッションマネージャーで接続するので「接続」をクリックします。
image.png

「セッションマネージャ」タブから「接続」をクリックします。
image.png

接続したら、以下のコマンドで1aディレクトリの作成と、1aディレクトリは以下にindex.htmlを作成します。

sudo su
mkdir /var/www/html/1a
nano /var/www/html/1a/index.html

# ~エディタ画面~
<h1>this is 1a</h1>
# 保存してる閉じるにはCtrl + x → y → Enter
# ~エディタ画面終了~

cat /var/www/html/1a/index.html
# 出力に<h1>this is 1a</h1>と表示されればOK

image.png

コマンド作業が完了したら「終了」ボタンでセッションマネージャーを抜けて、今度は
「パブリックIP/1a」
でアクセスしてみます。
作成したindex.htmlの内容が表示されればOKです。
image.png

これで1台目のEC2インスタンスの設定は完了です。
同様に、もう片方のAZ(ap-northeast-1c)のパブリックサブネットに2台目のEC2インスタンスを構築しましょう。
タグや表示内容は分かりやすいように1台目と変えておくとよいです。
注意点として、2台目のディレクトリは1aではなく1cで作成して下さい。
僕は間違えて1aで作ってしまったので1度削除しています(笑)
image.png

image.png

これで各AZに1台ずつEC2インスタンスを構築できました。

ALBの作成

ALBの作成方法については、こちらを参考にしてください。
以下に注意して下さい。
・ターゲットグループ作成時の「Health check path」を変更してください。
image.png

・ターゲットグループは2つ作成しますので、各グループには1つずつのインスタンスを紐付けます。
image.png

1つ目のターゲットグループはALB作成時に一緒に作成しているので、2つ目のグループは自分で作ります。
image.png

パスだけ変更します。
image.png

1cのインスタンスを登録します。
image.png

この時点では1cのターゲットグループはALBに紐づけられていませんが、あとで設定するのでこのままでOKです。
image.png

現時点で
「ALBのDNS/1a」
でアクセスすると、1aのインスタンスのページが表示されます。
image.png

一方、
「ALBのDNS/1c」
は紐づけていないので、1aのインスタンスにルーティングされますが、1aのインスタンスには「/1c/」のディレクトリがないので、「Not Found」が返ってきます。
image.png

ALBのリスナールールの編集

それではパスベースルーティンのための設定をリスナールールで行います。
ALBの画面で「リスナー」タブから「ルールの表示/編集」をクリックします。
image.png

新しいルールを追加します。
image.png

パスが「/1a/*」だったら、1aのインスタンス向けのターゲットグループに転送するよう設定して保存します。
image.png

ついでにデフォルトルールもちょっと変えます。
image.png

同様に、パスが「/1c/*」だったら、1cのインスタンス向けのターゲットグループに転送するよう設定して保存します。
image.png

既存の転送先を削除します。
image.png

指定のパス以外は「403」のhtmlを返すように設定します。
image.png

最後に「更新」をクリックします。
image.png

これでリスナールールの設定はOKです。

動作確認

それでは/1a/、/1c/、それ以外でアクセスしてみましょう。
まずは/1a/からです。
OKですね。
image.png

続いて/1c/です。
こちらもOKです。
image.png

最後にデフォルトのDNS名でアクセスしてみます。
設定どおり403が返ってきました。
image.png

期待通り、パスによって振り分けるパスベースルーティングを実現できました。

ちょっとした勘違い

実はパスベースルーティングを最初に知った時、インスタンス内にパスに対応するディレクトリがなくてもよいと思っていました。
パスによって振り分けるターゲットグループを変えるだけで、ディレクトリ構造は関係ないと思っていたんです。
ただルーティングするのではないということを知りました。

まとめ

今回はALBのパスベースルーティングをやってみました。
リスナールールで色々な条件によって振り分けができるので、興味がある方は試してみてください。
今回の内容が少しでも参考になれば幸いです。

参考資料

Application Load Balancer でのパスベースのルーティングを実現するにはどうすればよいですか?

Discussion