我在 ECS AWS 中为部署在 ECS 中的 django 应用程序容器运行以下负载均衡器:
resource "aws_lb" "api" {
name = "${local.prefix}-api"
load_balancer_type = "application"
subnets = [
aws_subnet.public_a.id,
aws_subnet.public_b.id
]
security_groups = [aws_security_group.lb_api.id]
tags = local.common_tags
}
resource "aws_lb_target_group" "api" {
name = "${local.prefix}-api"
protocol = "HTTP"
vpc_id = aws_vpc.main.id
target_type = "ip"
port = 8000
health_check {
path = "/admin/login/"
}
}
resource "aws_lb_listener" "api" {
load_balancer_arn = aws_lb.api.arn
port = 80
protocol = "HTTP"
default_action {
type = "redirect"
redirect {
port = "443"
protocol = "HTTPS"
status_code = "HTTP_301"
}
}
}
resource "aws_lb_listener" "api_https" {
load_balancer_arn = aws_lb.api.arn
port = 443
protocol = "HTTPS"
certificate_arn = aws_acm_certificate_validation.cert.certificate_arn
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.api.arn
}
}
resource "aws_security_group" "lb_api" {
description = "Allow access to Application Load Balancer"
name = "${local.prefix}-lb-api"
vpc_id = aws_vpc.main.id
ingress {
protocol = "tcp"
from_port = 80
to_port = 80
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
protocol = "tcp"
from_port = 443
to_port = 443
cidr_blocks = ["0.0.0.0/0"]
}
egress {
protocol = "tcp"
from_port = 8000
to_port = 8000
cidr_blocks = ["0.0.0.0/0"]
}
tags = local.common_tags
}
我有一个几乎相同的反应前端容器文件。唯一的区别是“前端”中的“api”一词的替换、目标组端口(在前端负载均衡器的情况下为 80)以及运行状况检查路径(对于前端来说只是“/”)
当我只部署API时,我可以在浏览器上正常访问应用程序。但是,当我添加前端负载均衡器时,我无法在浏览器中访问前端(错误“503 服务暂时不可用”)。 django 应用程序继续工作,但过了一段时间,它也崩溃了。
我查看了 ECS UI,发现集群、任务和容器运行没有问题。但我在健康检查中不断出现错误。这可能是什么原因?
哦,所以您遇到了“503 服务暂时不可用”错误,是吗?好吧,我们不是陷入困境了吗!这就是负载均衡器表达“我不知道将该请求发送到哪里!”的方式。但别担心,我会帮你解决这个问题。
首先,让我们检查一下健康检查。你知道,那些应该告诉负载均衡器你的服务是活跃的。确保他们指向正确的位置并获得良好的 200 状态代码作为响应。
接下来是您的目标组配置。每个目标组都应使用正确的端口和协议与正确的服务绑定。如果您在任务定义中使用 awsvpc 网络模式,请确保目标类型设置为“IP 地址”。
现在,进入负载均衡器侦听器。这些人需要为前端和后端连接设置正确的协议和端口。
我们不要忘记安全组。需要设置这些以允许必要端口上的流量。
最后,看看您在 ECS 中的服务配置。您的服务应该正确地与其各自的目标群体联系起来。
如果您检查了所有这些,但仍然遇到问题,那么……可能是时候卷起袖子深入研究这些服务日志或为负载均衡器启用访问日志了。因为有时候,你必须把手弄脏!