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

最終更新日: 2022 年 5 月 4 日

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

簡単な説明

Application Load Balancer では、URL に基づいてリクエストをターゲットグループに転送するルールを持つリスナーを作成できます。この機能は、Classic Load Balancer、Network Load Balancer、Gateway Load Balancer など、他の種類のロードバランサーでは使用できません。パスパターンルールは URL のパスにのみ適用され、URL のクエリパラメータには適用されません。パスパターンの詳細については、「パスの条件」を参照してください。

Application Load Balancer でパスベースのルーティングを確立するには、次の操作を実行します。

  1. ターゲットグループを作成します。
  2. リスナールールを設定します。

ターゲットグループを作成する前に、次の前提条件が満たされていることを確認してください。

解決方法

サービス Aサービス B の 2 つのサービスがあり、アプリケーションがポート 80 でこれらのサービスで実行されているとします。例えば、サービス A はパス /svcA でアプリケーションを実行し、サービス B はパス /svcB でアプリケーションを実行します。

ターゲットグループを作成する

インスタンスが作成されたら、これらのインスタンスをターゲットグループに登録します。ロードバランサーで設定されたリスナールールに基づいて、リクエストは、ターゲットグループに指定したポートとプロトコルを使用して、登録されたターゲットに転送されます。ただし、ターゲットを個別に登録するときにポート情報を上書きできます。詳細については、「ターゲットグループの作成」を参照してください。

例えば、[Protocol] (プロトコル) が HTTP[Port] (ポート) が 80 の 2 つのターゲットグループを作成し、それぞれにアプリケーションがデプロイされているとします。例えば、サービス A を実行している EC2 インスタンスを target-group-A に登録するとします。このターゲットグループでは、HealthCheckProtocolHTTP として、HealthCheckPath/svcA として設定できます。

サービス B を実行している EC2 インスタンスを target-group-B に登録します。このターゲットグループでは、HealthCheckProtocolHTTP として、HealthCheckPath/svcB として設定できます。

ターゲットグループとの間でいつでもターゲットを追加または削除できます。詳細については、「ターゲットグループへのターゲットの登録」を参照してください。

リスナーのルールでターゲットグループを指定すると、ロードバランサーは、ロードバランサー用に有効にされているアベイラビリティーゾーンにあるターゲットグループに登録されているすべてのターゲットのヘルスを継続的にモニタリングします。ロードバランサーは、正常な登録済みターゲットにリクエストをルーティングします。詳細については、「ターゲットグループのヘルスチェック」を参照してください。

リスナールールを設定する

Application Load Balancer のリスナーを作成する場合、デフォルトルールに加えて 1 つ以上のルールを定義できます。ルールは、優先度、アクション、および 1 つ以上の条件で構成されます。デフォルトルールには条件を定義できません。デフォルト以外のルールの条件がいずれも満たされない場合、デフォルトルールのアクションが実行されます。

ルールの優先度の詳細については、「ルールの順序変更」を参照してください。

ルールのアクションの詳細については、「ルールアクションタイプ」を参照してください。

ルールの条件の詳細については、「ルールの条件のタイプ」を参照してください。

Application Load Balancer でパスベースのルーティングを実装するには、リスナールールを設定する必要があります。リクエストをルーティングする際に基づくパスパターンごとに 1 つのルールを設定する必要があります。

例:

リスナールール 1: リクエスト URL パスに /svcA という文字列が含まれている場合は、リクエストを target-group-A に転送します。これは、target-group-A には、指定されたパスでアプリケーションを実行するサービス A が含まれているためです。

リスナールール 2: リクエスト URL パスに文字列 /svcB が含まれている場合、そのリクエストを target-group-B に転送します。これは、target-Group-B には、指定されたパスでアプリケーションを実行するサービス B が含まれているためです。

新しい HTTP リスナーを作成するには、「HTTP リスナーを作成する」を参照してください。

新しい HTTPS リスナーを作成するには、「HTTPS リスナーを作成する」を参照してください。

条件とアクションを含むリスナールールを更新するには、次の操作を実行します。

  1. Amazon EC2 コンソールを開きます。
  2. ナビゲーションペインの [Load Balancing] (ロードバランシング) で、[Load Balancers] (ロードバランサー) を選択します。
  3. ロードバランサーを選択し、[Listeners] (リスナー) を選択します。
  4. リスナーを更新するには、[View/edit rules] (ルールを表示/編集) を選択します。
  5. メニューバーの [Add rules] (ルールを追加) アイコン (プラス記号) を選択します。これにより、ルールを優先順に挿入できる場所に [Insert Rule] (ルールを挿入) アイコンが追加されます。
  6. 前のステップで追加した [Insert Rule] (ルールを挿入) アイコンのいずれかを選択します。
  7. /svcA のパスベースのルールを追加するには、[Add condition] (条件を追加)、[Path] (パス) を選択しパスパターン /svcA を入力します。条件を保存するには、チェックマークアイコンを選択します。
  8. 転送アクションを追加するには、[Add action] (アクションを追加)、[Forward to] (転送先) の順に選択し、ターゲットグループ target-group-A を選択します。
  9. [Save] (保存) を選択します。

次の変更を加えて、パス /svcB について前述のステップを繰り返します。

  • ステップ 6 では、パスパターン /svcB を入力します。
  • ステップ 7 では、ターゲットグループ target-group-B を選択します。

詳細については、「Application Load Balancer のリスナールール」を参照してください。

注: パスベースのルーティングルールは、完全一致を探します。この例では、パスベースのルーティングは /svcA と /svcB のパス定義を使用します。アプリケーションで、/svcA/doc や /svcB/doc など、これらのパスのさらに下にリクエストをルーティングする必要がある場合は、パスベースのルーティングルールの条件を記述するときにワイルドカードを含めます。/svcA*/svcB* のようなパスパターンを使用して、リクエストをルーティングするときにこれらのパス上のドキュメントが必ず考慮されるようにします。

パスベースのルーティングをテストする

このルーティングをテストするには、Application Load Balancer の DNS 名をウェブブラウザにコピーし、URL パス /svcA または /svcB を追加します。Application Load Balancer リスナーがリクエストを受信すると、リスナーはパス条件に基づいてそのリクエストを適切なターゲットグループに転送します。

例えば、Application Load Balancer の DNS 名が alb-demo-1234567890.us-west-2.elb.amazonaws.com であるとします。

  • http://alb-demo-1234567890.us-west-2.elb.amazonaws.com/svcA は、サービス A を返却する必要があります。
  • http://alb-demo-1234567890.us-west-2.elb.amazonaws.com/svcB は、サービス B を返却する必要があります。

パスベースのルーティングを使用すると、Application Load Balancer では、リスナールールとターゲットグループを使用して、単一のロードバランサーの背後で複数のマイクロサービスをホストできます。そのため、クライアントのリクエストをアプリケーションにルーティングする複雑なルールを設定できます。パスベースのルールに加えて、ホストヘッダー、ユーザーエージェントヘッダー、およびクエリパラメータ値に基づいて特定のアプリケーションにリクエストをルーティングすることもできます。詳細については、「Advanced request routing for AWS Application Load Balancers」(AWS Application Load Balancer の高度なリクエストルーティング) を参照してください。