ProGlove가 수천 개의 AWS 계정에서 100만 개의 Lambda 함수를 운영하며 겪은 멀티테넌트 SaaS 아키텍처 여정을 담은 글이다. 단순한 용량 확장이 아닌 효율성 확장이 핵심이며, 계정 격리, 동기화 문제, 배포 엔진의 한계를 단계별로 풀어간다.
핵심 포인트- 테넌트별 AWS 계정 격리로 보안 경계, 비용 투명성, 쿼터 독립을 동시에 확보했다.
- 수백 개 계정의 Lambda 스케줄이 동기화되면서 발생하는 Self-DDoS 문제를 지터(jitter)와 단계적 업데이트로 해결했다.
- EventBridge→Lambda 경로에서 SQS를 제거해 지속적 폴링 비용을 절감하고, AsyncEventsDropped와 ConcurrentExecutions 메트릭으로 안전성 모니터링으로 대체했다.
- CloudFormation StackSets가 100만 함수 규모에서 성능 상한에 도달해 AWS 서비스팀과 조기 협력을 시작했다.
- 비활성 계정 비용을 최적화해 계정당 월 1달러 미만, 관찰 가능성 비용을 3달러→0.70달러로 줄였다.
상세 정리- 계정당 테넌트 모델: 각 고객에게 독립 AWS 계정 부여 — 쿼터 격리로 noisy tenant 영향 차단, 비용 투명성 확보.
- 계정 프로비저닝: AWS Organizations + Step Functions 자동화로 15분 이내 신규 계정 세팅 완료, 추가 비용 거의 0.
- 마이크로서비스 구성: 각 마이크로서비스가 5~15개 Lambda 함수로 구성되며, Step Functions 조율 + EventBridge 라우팅 + DynamoDB 기본 저장소 패턴을 사용한다.
- Phase 3 — Self-DDoS: 수백 계정에서 Lambda 스케줄이 동시에 실행되며 요청 스파이크 발생. '같은 시간에 같은 것을 동시에 하지 말라' 원칙으로 지터 강제 + 단계적 업데이트 도입.
- Phase 4 — Scale-to-Zero 재설계: SQS 폴링이 idle 계정에서 지속 비용을 유발해 SQS 제거. 실패는 계정별 DLQ 대신 중앙 집중식 DLQ로 모아 폴링 오버헤드 제거.
- Phase 5 — 배포 엔진 한계: StackSets가 1M 함수 규모에서 성능 천장 도달. AWS 팀과 조기 파트너십으로 로드맵 영향 및 EventBridge 이벤트 집계를 통한 자동 복원 구현.
- Phase 6 — 모노레포: 20개 마이크로서비스를 모노레포로 통합해 보안 스캔, CI/CD, 도구 일관성 확보.
- 숨겨진 비용: CloudWatch 알람과 외부 관찰 가능성 집계가 예상치 못한 비용 유발 — 우선순위 기반 데이터 포워딩으로 관찰 가능성 비용 3달러→0.70달러 절감.
- 핵심 인사이트: '0에서 100만 Lambda 함수로의 확장은 용량의 문제가 아니라 효율성의 문제' — 볼륨보다 효율 확장이 앞서야 한다.
왜 읽나수천 개 계정을 가로지르는 대규모 멀티테넌트 SaaS를 운영하거나 서버리스 아키텍처를 진지하게 고민하는 인프라/백엔드 엔지니어에게 실전 패턴 레퍼런스.