| 3 min read

terraform 是一款通过代码来组织基础架构的工具。

Use Infrastructure as Code to provision and manage any cloud, infrastructure, or service

如果你是用的 AWS 的整套服务,你可以通过它实现对 S3, ECR, web load balancer 等服务的配置。当然它除了支持 AWS 也支持 阿里云 Google Cloud 等平台。非常适合不需要太多运维知识的工程师。

今天主要是我们需要配置域名和应用的绑定。比如我们部署了某个 Web 服务,实现域名和应用的关联,我们需要用到 aws_lb_listener

官方有提供一段参考,类似这样的:

resource "aws_lb_listener_rule" "static" {
  listener_arn = "${aws_lb_listener.front_end.arn}"
  priority     = 100

  action {
    type             = "forward"
    target_group_arn = "${aws_lb_target_group.static.arn}"
  }

  condition {
    path_pattern {
      values = ["/static/*"]
    }
  }

  condition {
    host_header {
      values = ["example.com"]
    }
  }
}

这是一个基本的配置。其中这涉及了几个关键的配置选项。

  • listener_arn Web Load Balancer 设置的ARN
  • priority 访问优先级,(1-5000) 越靠前优先级越高,多个规则不能用同样的优先级
  • action 定义 web load balancer 的行为
  • condition 匹配条件,可以设置多个条件,必须满足设置的条件才能匹配。

其中比较重要的就是 actioncondition 了。

action 配置

其中比较重要的是 type 和 target_group_arn。

type 可以设置成 forwardredirectfixed-responseauthenticate-cognitoauthenticate-oidc

其中常见的是 forwardredirectfixed-response

设置 forward 是需要同时设置 target_group_arn 即要指明和 web lb 具体绑定的 ARN。

设置 redirect:

resource "aws_lb_listener" "front_end" {
  load_balancer_arn = "${aws_lb.front_end.arn}"
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

顾名思义,用于我们域名的跳转。

设置 fixed-response 是比如我们需要设置固定的 response:

resource "aws_lb_listener" "front_end" {
  load_balancer_arn = "${aws_lb.front_end.arn}"
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "fixed-response"

    fixed_response {
      content_type = "text/plain"
      message_body = "Fixed response content"
      status_code  = "200"
    }
  }
}

也可以返回成 application/json 这种,这个就是设置常规的 HTTP 返回。

authenticate-cognitoauthenticate-oidc 用的比较少,主要用于登录授权这些, 这里就不介绍了,有兴趣可以自行阅读 :https://www.terraform.io/docs/providers/aws/r/lb_listener.html#authenticate-cognito-action

condition 配置

每条规则可以设置一到多个条件。大多数条件类型只能按规则设置一次,除了http-header 或者 query-string 可以设置多次。

  • host_header 包含的值主要是用于匹配主机规则,类似 xxx.example.com 或者 *.example.com, 支持 * 或者 ? 用于参与匹配。
resource "aws_lb_listener_rule" "host_based_routing" {
  listener_arn = "${aws_lb_listener.front_end.arn}"
  priority     = 99

  action {
    type             = "forward"
    target_group_arn = "${aws_lb_target_group.static.arn}"
  }

  condition {
    host_header {
      values = ["my-service.*.terraform.io"]
    }
  }
}
  • path_pattern 用于匹配包含的路径,类似 :
condition {
    path_pattern {
      values = ["/static/*"]
    }
  }
  • http_header 用于匹配 HTTP 的 header 比如:
condition {
    http_header {
      http_header_name = "X-Forwarded-For"
      values           = ["192.168.1.*"]
    }
  }
  • http_request_method 用于设置允许的 HTTP 请求方法

  • queryString 用于匹配 url 查询符。

condition {
    query_string {
      key   = "health"
      value = "check"
    }

    query_string {
      value = "bar"
    }
  }

大概基本配置就是这些, 可以实现我们常见 Web 域名的绑定,跳转等。

扩展阅读

You Can Speak "Hi" to Me in Those Ways