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 设置的ARNpriority
访问优先级,(1-5000) 越靠前优先级越高,多个规则不能用同样的优先级action
定义 web load balancer 的行为condition
匹配条件,可以设置多个条件,必须满足设置的条件才能匹配。
其中比较重要的就是 action
和 condition
了。
action 配置
其中比较重要的是 type 和 target_group_arn。
type
可以设置成 forward
,redirect
,fixed-response
,authenticate-cognito
和authenticate-oidc
。
其中常见的是 forward
,redirect
,fixed-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-cognito
和authenticate-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 域名的绑定,跳转等。