ALBでhttpをhttpsにリダイレクトできるやつが便利だった
今まではnginxでリダイレクトさせてた
こんな感じでhttpでアクセスしてきたらhttpsにリダイレクトするっていうのをnginxの設定で書いてました。
if ($http_x_forwarded_proto != https) { return 301 https://$host$request_uri; }
これで困るのは
ALBからのhealth checkはhttpで来るので、health checkも301が返っちゃうということです。
で、例えばuser agentがELB-healthchecker
で、かつ、httpだったら301じゃなくて200返すとか書けばいいんですが、nginxでand条件のif文書くのは結構大変なのです。(プログラミング言語ではないのでそういうもの)
こちらの記事を引用します。こんな感じになっちゃうイメージです。
そこで逃げ道は 文字列結合で判定。
if ($request_uri = /) { set $test A; } if ($host ~* teambox.com) { set $test "${test}B"; } if ($http_cookie !~* "auth_token") { set $test "${test}C"; } if ($test = ABC) { proxy_pass http://teambox-cms.heroku.com; break; }
ALBがリダイレクトもサポートした
ALBにはlister_rule
と言って、ホストヘッダーやpathがある特定の文字列だったら、転送先を変えるみたいなことができたんですが、それが固定レスポンスと、リダイレクトを設定できるようになりました。
この図でいうALBのところで、80番ポートに来たのは、443へリダイレクトしてくれるということです! なので、nginx側にredirect設定を書かずにすみます。ヘルスチェックも普通に200が返る。
terraformの設定
resource "aws_lb_listener_rule" "redirect_http_to_https" { listener_arn = "${module.alb_router.http_listener_arn}" action { # リダイレクトの設定はこれだけでOK type = "redirect" redirect { port = "443" protocol = "HTTPS" status_code = "HTTP_301" } } condition { # こんな感じで全部のリクエストを対象にできる field = "path-pattern" values = ["*"] } }
GUIではこんな感じで見えてます