ALB のパスベースのルーティングを試してみる

Study

概要

ALB のパスベースのルーティングは、パスの完全一致で評価されることが分かった話。

経緯

AWS の資格試験の勉強を通して、ALB でパスベースのルーティングが設定できることは知っていた。しかし、いざ設定するとなると、具体的な設定方法がよく分からなかった。

設定方法を調査したところ、次の記事を発見。

Application Load Balancer でパスベースのルーティングを実現する
Application Load Balancer の背後にある複数のマイクロサービスを実行しています。URL パスに基づいて特定のターゲットグループにリクエストを転送したいと考えています。

これを読めば大体の人は分かりそう。だが、設定するパスを具体的にイメージできなかった。特に、設定したパスは部分一致で評価されるのかという点が気になった。

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-tgdefault/index.nginx-debian.html
svcA-tgsvcA/svcA/index.nginx-debian.html
svcB-tgsvcB/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 の資格勉強でまあまあ知識を入れたので、「知っているが触ったことがない」設定やサービスが大量にある。その辺りについて手を動かしながらアウトプットしていきたい。

参考

Application Load Balancer とは? - Elastic Load Balancing
Application Load Balancerを使用して受信トラフィックを複数のターゲットに分散します。
タイトルとURLをコピーしました