You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS ECS负载均衡器运行一段时间后返回503状态码排查

AWS ECS负载均衡器运行一段时间后返回503状态码排查求助

我是一名后端服务开发者,DevOps(尤其是Terraform)经验不足。目前遇到的问题是:通过Github Actions将服务部署到AWS ECR和ECS后,初期API可以正常访问(健康检查路径及其他端点均返回200),但运行一段时间后,负载均衡器开始返回503状态码。

以下是我的Terraform配置详情:

VPC配置

resource "aws_default_vpc" "aws-vpc" {
  enable_dns_hostnames = true
  enable_dns_support   = true
  tags = {
    Name        = "${var.app_name}-vpc"
    Environment = var.APP_ENVIRONMENT
  }
}

ECR与ECS集群配置

resource "aws_ecr_repository" "aws-ecr" {
  name = "${var.upmentorship}-${var.APP_ENVIRONMENT}-ecr"
  tags = {
    Name        = "${var.upmentorship}-ecr"
    Environment = var.APP_ENVIRONMENT
  }
}

resource "aws_ecs_cluster" "aws-ecs-cluster" {
  name = "${var.upmentorship}-${var.APP_ENVIRONMENT}-cluster"
  tags = {
    Name        = "${var.upmentorship}-ecs"
    Environment = var.APP_ENVIRONMENT
  }
}

ECS服务配置

resource "aws_ecs_service" "aws-ecs-core-api" {
  name                 = "${var.core-api}-ecs"
  cluster              = aws_ecs_cluster.aws-ecs-cluster.id
  task_definition      = aws_ecs_task_definition.aws-ecs-core-api-task.arn //"${aws_ecs_task_definition.aws-ecs-core-service-task.family}:${max(aws_ecs_task_definition.aws-ecs-core-service-task.revision, data.aws_ecs_task_definition.core-service.revision)}"
  launch_type          = "FARGATE"
  scheduling_strategy  = "REPLICA"
  desired_count        = 2
  force_new_deployment = true

  deployment_circuit_breaker {
    enable = true
    rollback = true
  }

  network_configuration {
    subnets          = aws_default_subnet.default_private.*.id
    assign_public_ip = true
    security_groups = [
      aws_security_group.service_security_group.id,
      aws_security_group.load_balancer_security_group.id
    ]
  }

  load_balancer {
    target_group_arn = aws_lb_target_group.target_group.arn
    container_name   = "${var.core-api}-${var.APP_ENVIRONMENT}-container"
    container_port   = 8080
  }

  depends_on = [aws_lb_listener.listener]
}

ECS任务定义配置

resource "aws_ecs_task_definition" "aws-ecs-core-api-task" {
  family = "${var.core-api}-task"
  execution_role_arn       = aws_iam_role.ecsTaskExecutionRole.arn
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = "2048"
  memory                   = "8192"
  task_role_arn            = aws_iam_role.ecsTaskExecutionRole.arn
  #  container_definitions = jsonencode([local.task_definition_containers])
  container_definitions = <<DEFINITION
  [
    {
      "name": "${var.core-api}-${var.APP_ENVIRONMENT}-container",
      "image": "${aws_ecr_repository.aws-ecr.repository_url}:latest",
      "entryPoint": [],
      "environment": ${data.template_file.env_vars.rendered},
      "essential": true,
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "${aws_cloudwatch_log_group.log-group.id}",
          "awslogs-region": "${var.AWS_REGION}",
          "awslogs-stream-prefix": "${var.core-api}-${var.APP_ENVIRONMENT}"
        }
      },
      "portMappings": [
        {
          "containerPort": 8080,
          "hostPort": 8080
        }
      ],
      "cpu": 1024,
      "memory": 4096,
      "memory_reservation": 8192,
      "networkMode": "awsvpc"
    }
  ]
DEFINITION
  tags = {
    name        = "${var.core-api}-ecs-td"
    environment = var.APP_ENVIRONMENT
  }
}

服务安全组配置

resource "aws_security_group" "service_security_group" {
  vpc_id = aws_default_vpc.aws-vpc.id

  ingress {
    from_port       = 0
    to_port         = 0
    protocol        = "-1"
    security_groups = [aws_security_group.load_balancer_security_group.id]
  }

  egress {
    from_port        = 0
    to_port          = 0
    protocol         = "-1"
    cidr_blocks      = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]
  }

  tags = {
    Name        = "${var.core-api}-service-sg"
    Environment = var.APP_ENVIRONMENT
  }
}

负载均衡器配置

resource "aws_alb" "application_load_balancer" {
  name               = "${var.core-api}-${var.APP_ENVIRONMENT}-alb"
  internal           = false
  load_balancer_type = "application"
  subnets            = aws_default_subnet.default_public.*.id
  security_groups    = [aws_security_group.load_balancer_security_group.id]

  tags = {
    Name        = "${var.core-api}-alb"
    Environment = var.APP_ENVIRONMENT
  }
}

负载均衡器安全组配置

resource "aws_security_group" "load_balancer_security_group" {
  vpc_id = aws_default_vpc.aws-vpc.id

  ingress {
    from_port        = 80
    to_port          = 80
    protocol         = "tcp"
    cidr_blocks      = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]
  }

  egress {
    from_port        = 0
    to_port          = 0
    protocol         = "-1"
    cidr_blocks      = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]
  }
  tags = {
    Name        = "${var.core-api}-sg"
    Environment = var.APP_ENVIRONMENT
  }
}

负载均衡器目标组配置

resource "aws_lb_target_group" "target_group" {
  name        = "${var.core-api}-${var.APP_ENVIRONMENT}-tg"
  port        = 80
  protocol    = "HTTP"
  target_type = "ip"
  vpc_id      = aws_default_vpc.aws-vpc.id

  health_check {
    healthy_threshold   = "3"
    interval            = "30"
    protocol            = "HTTP"
    matcher             = "200,301,302"//"200"
    timeout             = "10"
    path                = "/debug/liveness"
    unhealthy_threshold = "10"
  }

  tags = {
    Name        = "${var.core-api}-lb-tg"
    Environment = var.APP_ENVIRONMENT
  }
}

负载均衡器监听器配置

resource "aws_lb_listener" "listener" {
  load_balancer_arn = aws_alb.application_load_balancer.id
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type             = "forward"
    target_group_arn = aws_lb_target_group.target_group.id
  }
}

自动扩缩容配置

resource "aws_appautoscaling_target" "ecs_target" {
  max_capacity       = 2
  min_capacity       = 1
  resource_id        = "service/${aws_ecs_cluster.aws-ecs-cluster.name}/${aws_ecs_service.aws-ecs-core-api.name}"
  scalable_dimension = "ecs:service:DesiredCount"
  service_namespace  = "ecs"
}
resource "aws_appautoscaling_policy" "ecs_policy_memory" {
  name               = "${var.core-api}-${var.APP_ENVIRONMENT}-memory-autoscaling"
  policy_type        = "TargetTrackingScaling"
  resource_id        = aws_appautoscaling_target.ecs_target.resource_id
  scalable_dimension = aws_appautoscaling_target.ecs_target.scalable_dimension
  service_namespace  = aws_appautoscaling_target.ecs_target.service_namespace

  target_tracking_scaling_policy_configuration {
    predefined_metric_specification {
      predefined_metric_type = "ECSServiceAverageMemoryUtilization"
    }

    target_value = 80
  }
}

resource "aws_appautoscaling_policy" "ecs_policy_cpu" {
  name               = "${var.core-api}-${var.APP_ENVIRONMENT}-cpu-autoscaling"
  policy_type        = "TargetTrackingScaling"
  resource_id        = aws_appautoscaling_target.ecs_target.resource_id
  scalable_dimension = aws_appautoscaling_target.ecs_target.scalable_dimension
  service_namespace  = aws_appautoscaling_target.ecs_target.service_namespace

  target_tracking_scaling_policy_configuration {
    predefined_metric_specification {
      predefined_metric_type = "ECSServiceAverageCPUUtilization"
    }

    target_value = 80
  }
}

更新:
任务日志显示存在任务终止或重启事件,具体事件详情提示与资源限制相关的问题(如内存或CPU超出分配的配额)。

请问我的Terraform配置中可能存在什么问题?


内容的提问来源于stack exchange,提问作者shosho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:24:56