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
.
我正在尝试在我的 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
.