AWS ECS와 Lambda를 결합한 하이브리드 서버리스 아키텍처

하이브리드 구조의 기본 아이디어
전통적 서버리스인 Lambda는 짧은 작업, ECS는 지속적 과업에 각각 강점이 있습니다. 이 둘을 함께 쓰면, 꾸준한 작업과 갑작스러운 트래픽에 모두 유연하게 대응할 수 있습니다.
언제 쓰면 좋은가?
백그라운드 작업을 컨테이너 환경에서 안정적으로 처리할 때
갑작스런 트래픽이 몰릴 땐 ECS로 충분히 대응하기 어려울 때
ECS를 과도하게 할당하지 않고 비용 최적화를 원할 때
Lambda와 ECS에서 거의 같은 코드베이스를 활용하고 싶을 때
활용 예시
실시간 데이터 처리 파이프라인: ECS는 꾸준히 스트림을 처리, Lambda는 갑자기 데이터가 몰릴 때 추가로 대응
PDF 즉시 생성: ECS에서 대량 작업, Lambda로 단건 작업 처리
이미지/영상 처리 대기열 관리
주요 구성 요소와 역할
SQS Queue: 모든 작업이 일단 여기에 들어와 대기
ECS (Fargate): SQS에서 메시지를 읽어 안정적으로 처리
Lambda: SQS 대기열이 쌓이면 즉시 자동 확장해 빠르게 작업을 분산 처리
CloudWatch: SQS 대기 상태를 모니터링, 필요한 경우 Lambda의 동시 실행 수를 늘림
공유 저장소: 결과는 S3나 DynamoDB 등에 저장
작동 방식 한눈에 보기
작업이 SQS로 들어옴
ECS가 꾸준한 속도로 메시지를 처리
대기열이 일정 기준(수량 또는 지연시간) 이상 쌓이면 Lambda가 즉시 추가로 투입
Lambda가 대기열을 소진하면 자동으로 중지
ECS는 중단 없이 평상시 작업량을 계속 소화
인프라 코드 예시 (Terraform 기반)
아래는 각 리소스의 선언 코드 예시입니다.
resource aws_sqs_queue job_queue {
name = job-queue
visibility_timeout_seconds = 300
}
resource aws_ecs_cluster main {
name = hybrid-cluster
}
resource aws_ecs_task_definition ecs_task {
family = ecs-worker
requires_compatibilities = [FARGATE]
cpu = 512
memory = 1024
network_mode = awsvpc
container_definitions = jsonencode([
{
name = worker
image = 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-worker:latest
essential = true
environment = [
{ name = SQS_QUEUE_URL, value = aws_sqs_queue.job_queue.url }
]
}
])
}
장점 요약
비용효율: ECS는 평상시 작업을 저렴하게 처리, Lambda는 필요할 때만 실행되어 불필요한 요금 발생 없음
즉각적인 확장성: Lambda는 ECS보다 빠르게 트래픽 증가에 대응
코드 재사용성: Lambda와 ECS 모두 거의 같은 코드로 운영 가능
내구성: SQS 사용으로 작업 손실 없이 안정적
주의할 점
중복 처리 방지: ECS와 Lambda가 동시에 SQS 메시지를 읽으므로 메시지 가시성 타임아웃 설정이 중요
Lambda 콜드 스타트: Lambda가 처음 실행 시 다소 느릴 수 있으나, 주요 작업은 ECS가 계속 유지
비용 통제 필요: 트래픽 급증시 Lambda 요금이 급등할 수 있어 모니터링 필요
결론: 최적의 균형점
Lambda의 즉각 대응력과 ECS의 지속적 처리 능력을 결합하면 예측 가능한 작업과 갑작스런 스파이크를 동시에 잡을 수 있습니다. 서버를 직접 관리하지 않아도, 비용과 성능 모두에서 생산적인 아키텍처를 설계할 수 있습니다.