ALBのパスベースルーティングをやってみた
ALBにはパスに基づいてリクエストを振り分ける機能があり、巷では「パスベースルーティング」と呼ばれています。
Application Load Balancer では、URL に基づいてリクエストをターゲットグループに転送するルールを持つリスナーを作成できます。
Application Load Balancer でのパスベースのルーティングを実現するにはどうすればよいですか?
今回はこのパスベースルーティングを試してみたいと思います。
構成図
・パブリックサブネットを2つ用意
・ALBをパブリックサブネットに配置
・各サブネットに1台ずつEC2インスタンスを配置
・/1a
と/1c
でパスごとにリクエストをそれぞれのEC2インスタンスにルーティング
EC2はプライベートサブネットにあった方が安全ですが、今回は検証なのですべてパブリックサブネットに構築します。
前提
・VPCは10.0.0.0/16
で作成済み
・パブリックサブネットは10.0.1.0/24
と10.0.2.0/24
で作成済み
1. EC2インスタンス構築
まずはEC2インスタンスを構築するため、EC2コンソールに移動します。
EC2ダッシュボードから「インスタンスを起動」をクリックします。
今回はAmazon Linux 2 AMI (HVM)のAMIを選択します。
インスタンスタイプは検証なので「t2.micro」を選択します。
詳細設定は以下の様に設定しています。
・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
ストレージの設定はデフォルトのままでOKです。
タグはキーに「Name」、値に「Web-1a」と入力し、識別しやすくしておきます。
セキュリティグループは新規作成でも既存のグループでも良いです。
必要なルールは、HTTPでマイIPとALBからのアクセスを許可、SSH接続する場合はSSHでマイIPを許可ぐらいです。
確認画面で設定を確認して「起動」をクリックします。
今回はセッションマネージャーで接続するため、キーペアはなしでインスタンスを作成します。
Tera Termなどで接続する場合はキーペアが必要です。
その場合の接続方法は公式ドキュメントなどで調べればすぐわかると思いますので、そちらにお任せします。
これで片方のAZに1台のEC2インスタンスを起動できました。
試しにパブリックIPでアクセスしてみると、Apacheのデフォルトページが表示されるはずです。
表示されない場合は以下を確認してください。
・EC2起動時の詳細設定でパブリックサブネットを選択したか
・EC2起動時の詳細設定でユーザーデータを貼り付けたか
・EC2のセキュリティグループでHTTPをマイIPから許可しているか
今回はパスによって表示内容を切り替えたいので、インスタンスの中身をいじります。
セッションマネージャーで接続するので「接続」をクリックします。
「セッションマネージャ」タブから「接続」をクリックします。
接続したら、以下のコマンドで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
コマンド作業が完了したら「終了」ボタンでセッションマネージャーを抜けて、今度は
「パブリックIP/1a」
でアクセスしてみます。
作成したindex.htmlの内容が表示されればOKです。
これで1台目のEC2インスタンスの設定は完了です。
同様に、もう片方のAZ(ap-northeast-1c)のパブリックサブネットに2台目のEC2インスタンスを構築しましょう。
タグや表示内容は分かりやすいように1台目と変えておくとよいです。
注意点として、2台目のディレクトリは1a
ではなく1c
で作成して下さい。
僕は間違えて1a
で作ってしまったので1度削除しています(笑)
これで各AZに1台ずつEC2インスタンスを構築できました。
ALBの作成
ALBの作成方法については、こちらを参考にしてください。
以下に注意して下さい。
・ターゲットグループ作成時の「Health check path」を変更してください。
・ターゲットグループは2つ作成しますので、各グループには1つずつのインスタンスを紐付けます。
1つ目のターゲットグループはALB作成時に一緒に作成しているので、2つ目のグループは自分で作ります。
パスだけ変更します。
1cのインスタンスを登録します。
この時点では1cのターゲットグループはALBに紐づけられていませんが、あとで設定するのでこのままでOKです。
現時点で
「ALBのDNS/1a」
でアクセスすると、1aのインスタンスのページが表示されます。
一方、
「ALBのDNS/1c」
は紐づけていないので、1aのインスタンスにルーティングされますが、1aのインスタンスには「/1c/」のディレクトリがないので、「Not Found」が返ってきます。
ALBのリスナールールの編集
それではパスベースルーティンのための設定をリスナールールで行います。
ALBの画面で「リスナー」タブから「ルールの表示/編集」をクリックします。
新しいルールを追加します。
パスが「/1a/*」だったら、1aのインスタンス向けのターゲットグループに転送するよう設定して保存します。
ついでにデフォルトルールもちょっと変えます。
同様に、パスが「/1c/*」だったら、1cのインスタンス向けのターゲットグループに転送するよう設定して保存します。
既存の転送先を削除します。
指定のパス以外は「403」のhtmlを返すように設定します。
最後に「更新」をクリックします。
これでリスナールールの設定はOKです。
動作確認
それでは/1a/、/1c/、それ以外でアクセスしてみましょう。
まずは/1a/からです。
OKですね。
続いて/1c/です。
こちらもOKです。
最後にデフォルトのDNS名でアクセスしてみます。
設定どおり403が返ってきました。
期待通り、パスによって振り分けるパスベースルーティングを実現できました。
ちょっとした勘違い
実はパスベースルーティングを最初に知った時、インスタンス内にパスに対応するディレクトリがなくてもよいと思っていました。
パスによって振り分けるターゲットグループを変えるだけで、ディレクトリ構造は関係ないと思っていたんです。
ただルーティングするのではないということを知りました。
まとめ
今回はALBのパスベースルーティングをやってみました。
リスナールールで色々な条件によって振り分けができるので、興味がある方は試してみてください。
今回の内容が少しでも参考になれば幸いです。
Discussion