話題の記事

[新機能]Webサーバでの実装不要!ALBだけでリダイレクト出来るようになりました!

これまでWebサーバー側で実装が必要だったリダイレクト処理を、ALBだけで完結することが出来るようになりました!いかに簡単に実装できるかご紹介いたします!
2018.07.28

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

今回は ELB の新機能のご紹介です。

これまでリダイレクトは、Web サーバー側で実装する必要がありました。代表的な例としては、昨今、Web サイトのセキュアな通信、検索ランキングの向上を目的とした、HTTP → HTTPS のリダイレクトは多くのWebサーバーで実装されていると思います。ALB を経由した場合、リダイレクトループを回避するために X-Forwarded-Proto ヘッダー を利用したリダイレクトループ回避の実装など、ちょっとした工夫が必要でした。 今回のアップデートによって、これらのリダイレクトを ALB 側で実装できるようになったということです!これは嬉しいですね!

なお、同時に発表された固定レスポンスの新機能については、千葉のエントリーを参照してください。

[新機能]EC2やS3不要!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)でした!