
이번에 Next.js 프론트를 ECS Fargate + ALB 구조로 배포하면서 이상한 현상을 겪었다.
컨테이너는 분명히 살아있는데 ECS는 계속 태스크를 죽이고 다시 올렸다.
증상



task ... port 3000 is unhealthy in target-group ... reason: Health checks failed Amazon ECS replaced 1 tasks due to an unhealthy status.
그리고 무한 반복.
- 태스크 → 실행됨
- Target group → Unhealthy
- ECS → 태스크 교체
- 다시 Unhealthy
- 또 교체
무한 루프
1차 의심: 컨테이너 문제?
ECS Exec으로 직접 들어가서 확인했다.

전부 200
컨테이너 내부에서는 완벽히 정상
2차 의심: HTTPS 리다이렉트 문제?
ALB에서
- 80 → 443 리다이렉트
- 443 → target group
구성.
Next.js가 HTTPS 강제 리다이렉트 해서 Health check가 301 받는 건가 의심을 해봤는데
헤더 강제로 넣어서 테스트를 해도
Host: dev.speaknote.site X-Forwarded-Proto: https
→ 여전히 200.
리다이렉트 문제 아님.
3차 의심: Target Group 설정?
- Health check path → /
- → /health
- → /api/health
다 바꿔봤다.
여전히 Unhealthy.
진짜 원인: ALB 보안그룹 아웃바운드
여기서 깨달았다.
ALB 보안그룹 상태
인바운드
- 443 허용 (내 IP만)
아웃바운드
- 443만 허용
문제는 여기.
ALB는 443으로만 통신하지 않는다
ALB는 클라이언트와는 443으로 통신하지만,
타겟(ECS)으로는
타겟 포트(여기서는 3000) 로 접속한다.
즉,
그런데 ALB 보안그룹 아웃바운드가
로 되어 있었다.
그럼 ALB는 타겟으로 연결 자체를 못한다.
Health check도 못하고
Forward도 못한다.
해결 방법
ALB 보안그룹 수정
또는
수정하자마자
- Target group → Healthy
- ECS 교체 루프 종료
- 정상 접속
끝.
왜 내부에서는 200이었을까?
컨테이너 안에서는
정상.
하지만 ALB는
이 경로가 보안그룹에 막혀 있었음.
즉,
앱은 정상
네트워크가 막혀있던 것
정리
ECS에서 Unhealthy 뜨면 무조건 앱 문제부터 의심하는데
이번 케이스는 완전히 네트워크였다.
체크 순서
- 컨테이너 내부 200 확인
- Target group path 확인
- 리다이렉트 여부 확인
- ALB 보안그룹 아웃바운드 확인 ← 이게 핵심
오늘의 교훈
ALB는 클라이언트와 443으로 통신하지만
타겟과는 “타겟 포트”로 통신한다.
이걸 안 열어두면
헬스체크는 영원히 실패한다.
개 뻘~~~~짓을 했고,, 나는 또 새벽 3시에 잠들지만,,,, 한가지를 알아가서 행복하다..


'DevOps > AWS' 카테고리의 다른 글
| [AWS - ECS & ALB]ECS + ALB+RDS 기반 서비스 아키텍처 정리 (0) | 2026.02.10 |
|---|---|
| [cloud computing] 클라우드 컴퓨팅과 가상화 기술 (0) | 2025.12.11 |
| [cloud computing] 클라우드 컴퓨팅 (CC) 이란? (0) | 2025.12.10 |