Amazon web services Terraform AWS ALB侦听器规则路径

Amazon web services Terraform AWS ALB侦听器规则路径,amazon-web-services,terraform,aws-application-load-balancer,Amazon Web Services,Terraform,Aws Application Load Balancer,我正在尝试在我的ALB上设置一个侦听器规则,该规则应该将/api路径路由到指定的目标组,但由于某种原因,我似乎无法实现这一点 这是我的设置: resource "aws_lb" "main" { name = "${var.name}-alb-internal-${var.environment}" internal = false load_balancer_type = &

我正在尝试在我的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中运行)返回
禁止的
。因此,如果侦听器规则起作用,我希望访问
*.elb.amazonaws.com/api
将返回
禁止的
。然而,我得到的结果如下:

*.elb.amazonaws.com/
->
你好世界
(正确)

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

*.elb.amazonaws.com/api/health
->
未找到
(我的api ECS服务上存在
/health
路径,应为“OK”,并返回
200

我已经成功地测试了我的ECS API服务是否可以通过不使用侦听器规则正常工作,并将侦听器默认操作直接转到我的目标组


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

我看不出您的设置有任何问题。我认为所有的工作都如预期的那样:

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

嗯,很有趣。从您的最后一点来看,我得到的印象是,这个侦听器规则实际上并没有进行转发(例如,Nginx使用代理传递),而是更像一个“映射”。。。这意味着我的ECS服务实际上需要配置与侦听器规则中相同的基本路径才能正常工作…@Luke我认为你不能像在nginx上那样执行复杂的重定向。