概要
ALB のパスベースのルーティングは、パスの完全一致で評価されることが分かった話。
経緯
AWS の資格試験の勉強を通して、ALB でパスベースのルーティングが設定できることは知っていた。しかし、いざ設定するとなると、具体的な設定方法がよく分からなかった。
設定方法を調査したところ、次の記事を発見。
これを読めば大体の人は分かりそう。だが、設定するパスを具体的にイメージできなかった。特に、設定したパスは部分一致で評価されるのかという点が気になった。
ALB について
AWS (Amazon Web Services) のサービスである ELB (Elastic Load Balancer) のうちの一種。
ELB は、クライアントと複数のサーバーの間に配置され、クライアントからのリクエストを個々のサーバーに振り分ける役割を持つ。
ALB (Application Load Balancer) は、アプリケーション層(レイヤー7)におけるルーティングを実施する。
ALB では、リクエストの振り分けを制御するために、ルーティングのルールを設定することができる。そのうちの一つが、パスベースのルーティングである。
検証
想定
パスに /svcA/ が含まれているときは svcA-tg に、/svcB/ が含まれているときは svcB-tg にリクエストを振り分けたい状況を想定する。
リソースの作成
nginx をインストールした EC2 (Elastic Compute Cloud) インスタンスを3つ作成し、それぞれをターゲットグループに登録。
ターゲットグループ名 | インスタンス名 | ドキュメントルートからのサービスのパス |
default-tg | default | /index.nginx-debian.html |
svcA-tg | svcA | /svcA/index.nginx-debian.html |
svcB-tg | svcB | /svcB/service/index.nginx-debian.html |
続いて、default-tg をリスナーとして ALB を作成。
作成した ALB のリスナールールを編集し、条件と転送先を設定。ALB は何度か使用したことがあったが、リスナールールを設定したのは初めてだった。
ALB のリスナールールの設定画面は古の設定画面。いまの AWS コンソールに慣れていると少し操作しづらい。ALB は使用頻度が高いが、全体的に古の画面のままの印象。
部分一致の検証
次のようにリスナールールを追加した。
- パスが
/svcA/
であるとき、svcA-tg にルーティング - パスが
/svcB/
であるとき、svcB-tg にルーティング
以下、 ALB のドメインを -.elb.amazonaws.com
と表記する。
svcA にアクセスするため、-.elb.amazonaws.com/svcA/
を指定。配置した index.nginx-debian.html
が表示された。
svcB にアクセスするため、-.elb.amazonaws.com/svcB/service/
を指定。エラーになる。パスが /svcB/
と一致しなかったため、デフォルトルールの転送先である default-tg にルーティングされた。しかし、default-tg には /svcB/service/
が存在しないためエラーになった。
設定したパスに対して完全一致でルーティングを行っていることが分かった。
完全一致でルーティングを行っているということは、svcA にアクセスしようとして -.elb.amazonaws.com/svcA/index.nginx-debian.html
とファイル名まで指定するとエラーになる。先程と同様、デフォルトルールが適用され、default-tg にルーティングされている。
今回の正しい設定
次のようにリスナールールを変更した。
- パスが
/svcA/*
であるとき、svcA-tg にルーティング - パスが
/svcB/*
であるとき、svcB-tg にルーティング
svcA に関して、-.elb.amazonaws.com/svcA/index.nginx-debian.html
のようにファイル名を指定した際にも、想定通りのアクセスが可能になった。
もちろん svcB に関しても、-.elb.amazonaws.com/svcB/service/
を指定してアクセス可能になった。
まとめ
ALB のパスベースのルーティングでは、設定したパスは完全一致で評価される。
/svcA/*
のように、*
と組み合わせてパスを指定する場面が多いのではないかと思う。
感想
執筆時に発覚したこの記事のオチ。
実は、冒頭に挙げた記事に答えがあった。
注: パスベースのルーティングルールは、完全一致を探します。
引用元:Application Load Balancer でのパスベースのルーティングを実現するにはどうすればよいですか?
疑問に思ったことは、自分で調べて公式資料を見るのが一番。
実際に手を動かしてみるのもよかった。自らの手でやったことは強く記憶に残る(資料読むだけより楽しい)。ただ、時間の無駄にならないように程々に。今回は、パスベースのルーティングの設定自体をしたことがなかったので、勉強にはなった。
AWS の資格勉強でまあまあ知識を入れたので、「知っているが触ったことがない」設定やサービスが大量にある。その辺りについて手を動かしながらアウトプットしていきたい。