ACM、Route53、ALBの連携 – ALBのリスナールール

今回は、ALBのリスナールールの高度ルーティングを利用してみます。
2021.08.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、クラスメソッドコリアのヌヌです。

はじめに

構築順番は下の通りです。

  1. ALBの作成
  2. ACM、Route53、ALBの連携
  3. ALB高度リクエストルーティング機能利用 ー> 今回の主題

ABLリスナールール

ALBにはトラフィックをコントロールできるリスナールールという機能があります。 簡単な例としてはクライアントがHTTPで接続すると、HTTPSへのリダイレクトされることです。

過去にはホストヘッダーとパスベースのルーティングでけできましたが、HTTPヘッダー・HTTPリクエストメソッド ・文字例のクエリ・送信元IPのルールが追加され、もっと多様なリクエストルーティングが利用でき、これを高度リクエストルーティング機能と言います。

リスナールールの構成

コンソール画面でルールを見ると、IFとTHENの項目があります。 IFはルールの条件ことを、THENはその条件によった作業のことです。 「条件の追加」項目を見ると下記の条件が確認できます。

  • ホストヘッダー
    • ホストヘッダ、つまりドメインによったルーティングができる条件です。
  • パス
    • パスはサーバ内の経路をベースでルーティングできる条件です。
  • HTTPヘッダー
    • HTTPヘッダーの値を基準でルーティングをします。
  • HTTPリクエストメソッド
    • GET, POSTのようなHTTPメソッドによったルーティングができます。
  • 文字例のクエリ
    • URLパラメータによったルーティングできる条件です。
  • 送信元IP
    • リクエストしたIPアドレスごとのルーティングできる条件です。

「アクションの追加」 項目には下記のアクションを確認できます。

  • 転送先
    • リクエストをターゲットグループにルーティングします。
  • リダイレクト先
    • HTTP status codeを返します。HTTPSへのリダイレクトもできます。
  • 固定レスポンスを返す
    • 設定しておいたHTTP status codeとコンテンツタイプを返します。
  • 認証
    • HTTPSリスナーだけの機能でAamazon CognitoまたはOIDCを使ってリクエストを認証します。

簡単なテストをやってみながら確認してみます。

リスナールールを使ってみましょ

ロードバランサーのリスナー項目の「ルールの表示/編集」クリックしてルールを設定することができます。 ルールは上から下、1から順番の通りでルールを比較しながら一致するルールを選択します。

1. ホストヘッダーベース

ホストヘッダー条件を設定してルーティングをやってみます。

ホストヘッダーの値を「freeget.ml」で記入します。HTTPプロトコルのfreeget.mlで接続をすることを意味します。 条件はHTTPSへのリダイレクトをするようにします。 アドレスバーにhttp://freeget.mlを入力して結果を確認しましょう。

Chromeの開発者ツールのネットワークに入りますと、ヘッダーを確認できます。 Request Headersの中に「Host: freeget.ml」が書いてあり、Response Headersの中には「Location: https://freeget.ml:443/」があります。Hostはホストヘッダー、Locationはリダイレクトされる住所を表します。

2. パスベース

ウェブサーバ内部の経路をベースでルーティングします。EC2インスタンスに接続して下記のようにディレクトリとファイルを作っくてみます。

  • インスタンスA: /var/www/html/path1/index.html
  • インスタンスB: /var/www/html/path2/index.html

インスタンスA/Bにルーティングするためのそれぞれのターゲットグループも作ります。

続いてパスベースのルールを作成します。

  • パス: /path1/* 転送先: EC2-A
  • パス: /path2/* 転送先: EC2-B

設定が済みたらアドレスバーに「http://freeget.ml/path1 ・ path2」 を入力します。ページ更新をしてもパースによって設定したEC2だけ出ることが分かります。

3. HTTPヘッダーベース

HTTPヘッダー値によったルーティングができます。HTTPヘッダーの種類は多いので、今回はよく使われる「User-Agent」ヘッダーを使用してみます。

User-Agentヘッダーは、現在のユーザがどのようなクライアント(ブラウザやOSなど)の上でリクエストしたのかを表すヘッダーです。

下記のようにルールを設定します。

  • user-agent: Chrome

結果を確認してみます。

まず、Safariブラウザでアクセスすると既存のEC2インスタンスの画面が出ます。

そして、Chromeで接続すると「Browser: Chrome」 という文書が出ることが分かります。

各user-agentヘッダーを見るとSafariには「Chrome」がありませんが、Chromeには「Chrome」が含めていることが確認できます。

4. HTTP リクエストメソッドベース

GET, POSTのようなHTTPリクエストメソッドを基準でルーティングをします。POSTリクエストをテストするために今回はブラウザではなく curlを使ってテストを行ってみます。

設定

結果

設定した通りでGETとPOSTによって帰ってくる結果が違います。

5. 文字例クエリベース

文字例クエリを基準でルーティング設定ができます。

6. 送信元IPベース

送信元のIPを基準でルーティング設定ができます。

設定

結果

最後に

ALBの高給ルーティングの使い方について確認してみました。ALBのリスナールールを適切に活用して効率的なルーティングができるのがとても有用な機能だと思います。アプリケーションを作る時にとても役に立てると思います。