AWS ALBのホストベースルーティング設定について


お久しぶりです。インフラエンジニアの竹西です。
前回の投稿からかなり間が空いてしまいました。。。

さてさて今回はAWS ALBの高度ルーティングの一つ
ALBのホストベースルーティング設定方法を紹介しようと思います。

ホストベースルーティングとは

httpヘッダのHostフィールドにもとづいたALBへのリクエストを指定したターゲットグループへ
ルーティングすることが可能なALBの機能です。

メリットについて

ホストベースルーティング設定を使用するメリットは下記のようなものがあげられます。

  • 複数のALBを集約できる(コスト削減)
  • Nginxなどでプロキシサーバを建ててルーティング設定をしていたものをALBで代替できる

ユースケース

一つユースケースを取って考えたいと思います。

例えば、WEBサーバ1にはA.comがホストされ、WEBサーバ2にはB.comがホストされているWEBサーバがあるとします。

この2台のWEBサーバへのアクセスにおいて、A.comへのアクセスはWEBサーバ1のみへトラフィックをルーティングし、B.comへのアクセスはWEBサーバ2のみへトラフィックをルーティングしたいといった場合にホストベースルーティングを使用できます。

まずホストベースルーティングを使用しない構成で先ほどのユースケースを実現する方法を見てみましょう。
その場合、図1の2パターンが頭に浮かぶと思います。。

図1

  1. (図1 左)WEBサーバ1/WEBサーバ2に対して1台ずつALBを配置する。
  2. (図1 右)1台のALBに対しターゲットグループにproxyサーバを設定し、その後段にWEBサーバを配置する。

上記の2パターンを選択した場合下記のようなデメリットが発生します。
1. を選択した場合、ALBがWEBサーバ(ドメイン)の数と比例して増えALBの管理とコストの増加が顕著になってしまいます。
2. を選択した場合にはALBの数を抑えることができますが代わりにターゲットグループに配置するProxyサーバの設定が増えてしまい、管理が煩雑になってしまいます。

続いてホストベースルーティングを使用すると図2のような構成に変更することが可能です。

図2

こちらの構成では、図1の2パターンと比べ構成もシンプルにALBの数を集約できるため
先に述べたメリットを受けることができそうなので積極的に使っていきたいですね。

ホストベースルーティングの設定方法

事前準備

それでは今回は図2の構成を目標に設定方法を見ていきたいと思います。
事前準備としてWEBサーバ2台を作成してください。
また、VPC/サブネット/セキュリティグループの設定も忘れず設定してください。
※今回名前解決はALBのIPに対象のドメイン名で解決できるようにhostsに設定します。後述

設定シート

(名前は気にしないでください。わかりにくくてすみません。。)

ALB ドメイン ターゲットグループ WEBサーバ
take-alb-rule-test web1.alb-rule-test.clara.local take-alb-rule-test-web1 take-alb-rule-test1
web2.alb-rule-test.clara.local take-alb-rule-test-web2 take-alb-rule-test2

ALBの作成

AWSマネジメントコンソール > EC2ダッシュボード > ロードバランサ

  • 手順1:ロードバランサーの設定
    基本的な設定はデフォルトで進めます。
    リスナーは今回http(80)を使用します。
    VPC・AZは事前に作成したものを適宜設定してください。
  • 手順2:セキュリティ設定の構成
    httpsの使用を推奨されますがそのまま[次の手順]へ進んでください。
  • 手順3:セキュリティグループの設定
    事前に作成したものを適宜設定してください。
  • 手順4:ルーティングの設定
    新しくターゲットグループ1を作成します。HTTPでアクセスできるように設定してください。
    (事前にターゲットグループを作成している場合はどちらかのターゲットグループを選択します。)
    ※ ALB作成画面ではターゲットグループを一つしか紐づけられないので後程ターゲットグループ2を追加する必要があります。

    図3

  • 手順5:ターゲットの登録
    ターゲットグループ1にWEBサーバ1を登録します。

    図4

上記の手順を実施後、確認画面を確認し[作成]を押下すればALBが作成されます。

ターゲットグループの作成

ターゲットグループ2を作成します。
AWSマネジメントコンソール > EC2ダッシュボード > ターゲットグループ

先ほど ALBの作成 手順4でターゲットグループ1を作成したようにターゲットグループ2を作成します。

図5

その後、作成したターゲットグループ2を選択しWEBサーバ2を登録します。

図6

ホストベースルーティングの設定

AWSマネジメントコンソール > EC2ダッシュボード > ロードバランサ

リスナー タブ にて ルールの表示/編集を押下してルールの編集画面に入ります。

図7

画面左上のプラス を選択⇒画面中央の ルールの挿入 でルールを設定することができます。

図8

[+ 条件の追加] ⇒ “ホストヘッダー”を選択し ドメイン1 を入力します。

図9

続いて[+ アクションの追加] ⇒ “転送先”を選択しターゲットグループ1を選択します。

図10

図11 のように設定ができれば、ALBにドメイン1宛てのアクセスが到達した場合に
ターゲットグループ1(WEBサーバ1)へルーティングする設定の完了です。
設定ができれば画面右上の[保存]ボタンで設定を保存します。

図11

同じように ドメイン2⇒ターゲットグループ2(WEBサーバ2) の設定を追加します。
デフォルトアクションはそのままでもOKです。
設定が完了すればルーティング設定は図12のようになります。

これで図2にあるような下記のルーティング設定ができました。
web1.alb-rule-test.clara.local へのアクセスは take-alb-rule-test-web1(take-alb-rule-test1)
web2.alb-rule-test.clara.local へのアクセスは take-alb-rule-test-web2(take-alb-rule-test2)

また、上記に当てはまらないアクセスに関しては take-alb-rule-test-web1(take-alb-rule-test1) へ
ルーティングされます。

図12

hosts設定

接続確認をする前に hosts を編集して名前解決できるように設定しましょう。
※ DNS で設定しても問題ありません。筆者は面倒だったのでhostsで対応しました。

hostsに記載するのはALBのエンドポイントのIPアドレスなのでALBのIPアドレスを確認する必要があります。
digコマンドやnslookupコマンドで確認するなどしてIPアドレスを確認してください。

上記で確認できたIPアドレスをコピーして hostsに下記を追記して保存します。
これで接続の準備ができました。

接続確認

web1.alb-rule-test.clara.local へアクセス ⇒  take-alb-rule-test-web1(take-alb-rule-test1) コンテンツ表示

図13

web2.alb-rule-test.clara.local へアクセス ⇒  take-alb-rule-test-web2(take-alb-rule-test2) コンテンツ表示

図14

その他のドメイン(ALBエンドポイント) へアクセス ⇒  take-alb-rule-test-web1(take-alb-rule-test1) コンテンツ表示

図15

図13-15の通りホストベースルーティングができていることが確認できました!

さいごに

簡単にルーティングルールを設定できましたね。
ルーティング設定はホストベース以外にも条件にパスベースやHTTPヘッダ、送信元IPアドレスを設定可能です。
アクションには転送先以外にもリダイレクト先を指定したり、固定レスポンスを返却することが可能です。

これらのルーティング設定を活用すれば、今回のケースでその他のアクセス(ALBエンドポイント)へのアクセスをWEBサーバ1へルーティングしていましたが、固定レスポンスで403を返却することも可能です。

詳しくはこちらのドキュメントやAWS ブログなど参照ください。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-listeners.html#listener-rules
https://aws.amazon.com/jp/blogs/news/new-advanced-request-routing-for-aws-application-load-balancers/

それでは、今回もよんでいただきありがとうございました!!


hiromasa.takenishi

インフラエンジニア クラウド関連技術など

あわせて読みたい