【问题标题】:Terraform AWS ALB listener rule pathTerraform AWS ALB 侦听器规则路径
【发布时间】:2020-11-23 07:48:21
【问题描述】:

我正在尝试在我的 ALB 上设置一个侦听器规则,该规则应该将 /api 路径路由到指定的目标组,但由于某种原因,我似乎无法让它工作。

这是我的设置:

resource "aws_lb" "main" {
  name               = "${var.name}-alb-internal-${var.environment}"
  internal           = false
  load_balancer_type = "application"
  security_groups    = var.alb_security_groups
  subnets            = var.subnets.*.id

  tags = {
    Name        = "${var.name}-alb-${var.environment}"
    Environment = var.environment
  }
}

resource "aws_alb_target_group" "api" {
  name        = "${var.name}-tg-api-${var.environment}"
  port        = 8080
  protocol    = "HTTP"
  vpc_id      = var.vpc_id
  target_type = "ip"

  health_check {
    healthy_threshold   = "3"
    interval            = "30"
    protocol            = "HTTP"
    matcher             = "200"
    timeout             = "3"
    path                = var.health_check_path
    unhealthy_threshold = "2"
  }

  depends_on = [
    aws_lb.main,
  ]

  tags = {
    Name        = "${var.name}-tg-api-${var.environment}"
    Environment = var.environment
  }
}

resource "aws_alb_listener" "api" {
  load_balancer_arn = aws_lb.main.id
  port              = 80
  protocol          = "HTTP"

  default_action {
    type            = "fixed-response"

    fixed_response {
      status_code   = "404"
      content_type  = "text/plain"
      message_body  = "Hello world"
    }
  }
}

resource "aws_alb_listener_rule" "api_rule" {
  listener_arn = aws_alb_listener.api.arn
  priority     = 100

  action {
    type             = "forward"
    target_group_arn = aws_alb_target_group.api.arn
  }

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

在此设置中,我尝试将每个以 /api 开头的请求转发到我的 API 目标组。我已将固定响应设置为侦听器的默认操作,并且我已将响应主体设置为“Hello world”,以便区分。

执行GET / 时,我的API 服务(在ECS 中运行)返回Forbidden。因此,如果侦听器规则有效,我预计访问*.elb.amazonaws.com/api 将返回Forbidden。但是,这些是我得到的结果:

*.elb.amazonaws.com/ -> Hello World(正确)

*.elb.amazonaws.com/api -> Hello World(期待“Forbidden”,即我的API服务根路径的响应)

*.elb.amazonaws.com/api/health -> Not Found(期待“OK”,/health 路径存在于我的 API ECS 服务上并返回 200

我已通过不使用监听器规则并让监听器默认操作直接转到我的目标组,成功测试了我的 ECS API 服务正常工作。

如何使用我的侦听器规则将任何 /api 请求成功转发到我的目标组?

【问题讨论】:

    标签: amazon-web-services terraform aws-application-load-balancer


    【解决方案1】:

    我认为您的设置没有任何问题。我认为一切都按预期工作:

    • '/' 按预期工作。这里没有什么不寻常的。
    • /api 将默认为 /,因此您会在观察时看到“Hello World”。
    • /api/health 将需要您的 ecs 服务 /api/health,而不是 /health。所以如果你的ECS没有/api/health,你会得到Not Found

    【讨论】:

    • 嗯。有趣的。从你的最后一点我得到的印象是这个监听器规则并没有真正进行转发(例如 Nginx 使用代理通行证),但它更像是一个“映射”......这意味着我的 ECS 服务实际上需要配置具有与侦听器规则相同的基本路径,以使其实际正常工作...
    • @Luke 我认为你不能像在 nginx 上那样执行复杂的重定向。
    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 2020-10-18
    • 2021-11-27
    • 2020-03-30
    • 2019-10-09
    • 2021-06-20
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多