Terraform AWS ALB 侦听器规则路径

Terraform AWS ALB listener rule path

我正在尝试在我的 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”以进行区分。

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

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

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

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

我已成功测试我的 ECS API 服务在不使用侦听器规则的情况下正常工作,并且侦听器默认操作直接转到我的目标组。

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

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

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