まーぽんって誰がつけたの?

iOS→Scala→インフラなおじさん技術メモ

ALBでhttpをhttpsにリダイレクトできるやつが便利だった

今まではnginxでリダイレクトさせてた

f:id:masato47744:20181018022811p:plain

こんな感じでhttpでアクセスしてきたらhttpsにリダイレクトするっていうのをnginxの設定で書いてました。

if ($http_x_forwarded_proto != https) {
    return 301 https://$host$request_uri;
}

これで困るのは

ALBからのhealth checkはhttpで来るので、health checkも301が返っちゃうということです。

f:id:masato47744:20181018023156p:plain

で、例えば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が返る。

f:id:masato47744:20181018023245p:plain

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ではこんな感じで見えてます

f:id:masato47744:20181018023347p:plain