[新機能]Webサーバでの実装不要!ALBだけでリダイレクト出来るようになりました!
今回は ELB の新機能のご紹介です。
これまでリダイレクトは、Web サーバー側で実装する必要がありました。代表的な例としては、昨今、Web サイトのセキュアな通信、検索ランキングの向上を目的とした、HTTP → HTTPS のリダイレクトは多くのWebサーバーで実装されていると思います。ALB を経由した場合、リダイレクトループを回避するために X-Forwarded-Proto ヘッダー
を利用したリダイレクトループ回避の実装など、ちょっとした工夫が必要でした。
今回のアップデートによって、これらのリダイレクトを ALB 側で実装できるようになったということです!これは嬉しいですね!
なお、同時に発表された固定レスポンスの新機能については、千葉のエントリーを参照してください。
さっそく、やってみる
ロードバランサーの管理コンソールから、[リスナー]タブを開きます。今回は HTTP→HTTPS のリダイレクトになりますので、HTTP の[ルールの表示/編集]を開きます。
ルールを追加します。
[条件の追加]を開きます。今回はすべての条件において、HTTPS リダイレクトさせたいので、パス指定は「*(アスタリスク)」を設定しています。
[アクションの追加] から、[リダイレクト先] を選択。今回は単純に HTTP → HTTPS(443)へリダイレクトさせるため、[デフォルトホスト、パス、クエリを使用]を選択し、[301 - 完全に移動されました] を選択。
なお、URI パスは以下のコンポーネントで構成されており、
protocol://hostname:port/path?query
[カスタムホスト、パス、クエリを使用] を選択した場合、これらのコンポーネントをカスタムすることが可能となっています。
- protocol
- HTTPまたはHTTPS。HTTP を HTTP、HTTP を HTTPS、HTTPS を HTTPS にリダイレクト可能
- HTTPS を HTTP にリダイレクトすることは出来ない
- hostname
- port
- ポート番号(1〜65535)
- path
- 先頭が "/" で始まる絶対パス
- query
- クエリパラメータ
また、次の予約済みキーワードを使用して、元の URL の URI コンポーネントを、ターゲット URL に再利用することもできます。
- #{protocol} : 元のプロトコルを保持。プロトコルとクエリのコンポーネントで使用できる。
- #{host} : 元のドメインを保持。ホスト名、パス、およびクエリのコンポーネントで使用できる。
- #{port} : 元のポートを保持。ポート、パス、およびクエリのコンポーネントで使用できる。
- #{path} : 元のパスを保持。パスとクエリのコンポーネントで使用できる。
- #{query} : 元のクエリパラメータを保持。クエリのコンポーネントで使用する。
リダイレクトは、必要に応じて一時的(HTTP 302)または永続的(HTTP 301)のいずれかを設定できます。
動作確認
設定後、HTTP でアクセスするとHTTP/1.1 301 Moved Permanently
と、Location: https://albtest.xxxxxx.com:443/
となっており、設定したとおりに HTTPS(443)にリダイレクトされたことが判りますね!
$ curl -I http://albtest.xxxxxx.com HTTP/1.1 301 Moved Permanently Server: awselb/2.0 Date: Sat, 28 Jul 2018 09:10:53 GMT Content-Type: text/html Content-Length: 150 Connection: keep-alive Location: https://albtest.xxxxxx.com:443/
ログ
リダイレクトアクションが実行されると、以下のように ALB のアクセスログに記録されます。
http 2018-07-28T09:12:12.276955Z app/albtest/e55exxxxxxb56f4 119.xxx.xx.xx:51861 - -1 -1 -1 301 - 96 217 "HEAD http://albtest.xxxxxx.com:80/ HTTP/1.1" "curl/7.54.0" - - - "Root=1-5b5c336c-00cc3bae834992d5c3daf881" "-" "-" 1 2018-07-28T09:12:12.276000Z "redirect" "https://albtest.xxxxxx.com:443/"
また、成功したリダイレクトアクションの数は、HTTP_Redirect_Count
メトリックで報告されているので、CloudWatch から確認することができます。
さいごに
いかがだったでしょうか。本当に簡単にリダイレクト実装することが伝わったでしょうか!?今回は HTTP → HTTPS のプロトコルのリダイレクトでしたが、もちろんそれ以外にも、ホスト名、パス、ポート、クエリなど個々にカスタムすることで、さらに幅広いリダイレクトが ALB だけで実装できるかと思いますので、どんどん試してみてください!
以上!大阪オフィスの丸毛(@marumo1981)でした!