【AWS】ELB リスナールールでリダイレクト設定

はじめに

ウェブサイトの移設等でドメインを変更する機会はよくあると思います。その際、いきなり旧ドメイン削除せず新ドメインにリダイレクトしたりしますよね?設定方法はいくつか考えられると思いますが、今回は AWS ELB リスナールールを活用したリダイレクト設定方法を紹介します。

構成イメージ

リダイレクト設定前


リダイレクト設定後

やりたいこと

現ドメインリダイレクト先ドメイン
AAAAA.example.comBBBBB.example.com

  1. https://AAAAA.example.com/backup/xxxxx へアクセスした場合 https://BBBBB.example.com/new/backup/xxxxx へリダイレクト
  2. 上記以外の https://AAAAA.example.com/ へアクセスした場合 https://BBBBB.example.com/ へリダイレクト

もう少し細かく説明すると
1は
  パスが「/backup/」まで指定されたアクセスの場合
  リダイレクトする際に「/new/」パスをドメインの後ろに追加し
  既存パス「/backup/xxxxx/」は「/new/」パスの後に継承する設定
  例えばこのようなリダイレクトです
    https://AAAAA.example.com/backup/xxxxxhttps://BBBBB.example.com/new/backup/xxxxx
2は
  パスが「/backup/」以外でアクセスの場合
  パスがそのまま継承されリダイレクトする設定
  例えばこのようなリダイレクトです
    https://AAAAA.example.com/https://BBBBB.example.com/
    https://AAAAA.example.com/xxxxxhttps://BBBBB.example.com/xxxxx

ELB 設定・・・今回は ELB 作成は省略し、リスナールール設定のみ紹介します

[サービス > EC2 > ロードバランサー > 対象 LB > リスナー > ルール]
[ルールの表示/編集] を押下


現状は ELB ターゲットグループに EC2 がぶら下がってる状態です。
次の手順でリダイレクト設定に変更していきます。


まずは、前述のパターン1のリダイレクト設定を追加します。

[ルールの追加] - [ルールの挿入] を押下し
下記設定を追加し [保存] を押下

設定項目設定値
IFパス=/backup/*
THENリダイレクト先
プロトコルHTTPS
ポート#{port}
カスタムホスト、パス、クエリを使用
ホストBBBBB.example.com
パス/new/#{path}
クエリ#{query}
ステータスコード301 - 完全に移動されました

この際「パス=/backup/*」とすることで「/backup/」以降のパスがある場合でもリダイレクトしてくれます。
もし「*」無しで「パス=/backup/」で設定すると「https://AAAAA.example.com/backup/xxxxx」のように「/backup/」以降にパスがあるアクセスの際リダイレクト対応されません。
筆者はここで地味につまずきました。。。


続いて、パターン2のリダイレクト設定を追加します。
今回は既存ルールがあるので既存ルールを削除してからリダイレクト設定を追加します。

[ルールの編集] - [HTTPS 443: デフォルトアクション] - [ルールの編集]
[THEN 1.転送先 ] を削除
[アクションの追加] - [リダイレクト先] を選択し
下記設定を追加し [更新] を押下

設定項目設定値
THENリダイレクト先
プロトコルHTTPS
ポート#{port}
カスタムホスト、パス、クエリを使用
ホストBBBBB.example.com
パス/#{path}
クエリ#{query}
ステータスコード301 - 完全に移動されました

設定はこれで完了です。

リダイレクト確認

設定は完了したので、設定どおりにリダイレクトするか確認してみましょう。
まずはパターン1

$ curl -I https://AAAAA.example.com/backup/xxxxx
HTTP/1.1 301 Moved Permanently
Server: awselb/2.0
Date: Thu, 31 Mar 2022 02:09:10 GMT
Content-Type: text/html
Content-Length: 134
Connection: keep-alive
Location: https://BBBBB.example.com:443/new/backup/xxxxx

想定通り、「/new/」パスが追加され「BBBBB.example.com」ドメインへリダイレクトされました。
  https://AAAAA.example.com/backup/xxxxxhttps://BBBBB.example.com:443/new/backup/xxxxx

続いてパターン2

$ curl -I https://AAAAA.example.com/
HTTP/1.1 301 Moved Permanently
Server: awselb/2.0
Date: Thu, 31 Mar 2022 02:09:03 GMT
Content-Type: text/html
Content-Length: 134
Connection: keep-alive
Location: https://BBBBB.example.com:443/

$ curl -I https://AAAAA.example.com/xxxxx
HTTP/1.1 301 Moved Permanently
Server: awselb/2.0
Date: Thu, 31 Mar 2022 02:09:23 GMT
Content-Type: text/html
Content-Length: 134
Connection: keep-alive
Location: https://BBBBB.example.com:443/xxxxx

こちらも想定通り、「/backup/」パス以外でのアクセスなのでパスは継承され「BBBBB.example.com」ドメインへリダイレクトされました。
  https://AAAAA.example.com/https://BBBBB.example.com:443/
  https://AAAAA.example.com/xxxxxhttps://BBBBB.example.com:443/xxxxx

最後に

この仕組みを実装すれば EC2 内の apache/nginx 等でリダイレクト設定をする必要がなくなるので不要となる EC2 を削除することが出来、コスト的にもかなりお得になると思います。
そもそも使っていた ELB の設定をちょろっと変更するだけなので、新規で何か構築したり DNS 設定変更する手間も省けるので、サクッとリダイレクトしたい方にはお勧めの設定かと思います。
しかしながら、ELB もリダイレクトさせてるだけでそこそこコストはかかります。別の方法として CloudFront+S3 の組み合わせでも同じようにリダイレクトすることが可能なので、またの機会に書こうと思います。

参考リンク

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-listeners.html