서버리스 아키텍처 개요
핵심 개념
- 서버리스는 사용자가 서버를 직접 프로비저닝하거나 관리하지 않고 애플리케이션을 실행하는 방식
- 서버가 없다는 의미가 아니라, 서버 운영과 확장 관리를 AWS가 담당한다는 의미
- 개발자는 인프라 관리보다 코드, 이벤트 흐름, 데이터 처리 로직에 집중할 수 있음
- 트래픽 변화에 따라 자동 확장되는 서비스가 많음
- 사용량 기반 과금 모델을 제공하는 경우가 많아, 트래픽이 적거나 불규칙한 워크로드에 적합
- 단, 모든 서버리스 서비스가 “트래픽이 없으면 비용이 0원”인 것은 아님
- 예를 들어 DynamoDB 온디맨드, Lambda, API Gateway는 요청 기반 과금에 가깝지만, S3는 저장 용량에 따라 비용이 발생하고 Aurora Serverless는 최소 용량 설정에 따라 비용이 발생할 수 있음
- 서버 관리 부담을 줄이고 이벤트 기반 아키텍처를 구성할 때 서버리스 서비스를 우선 고려
대표 서버리스 서비스
| 서버리스 서비스 |
설명 |
| Lambda |
서버 관리 없이 함수 실행 |
| API Gateway |
REST, HTTP, WebSocket API 관리 |
| DynamoDB |
서버리스 NoSQL 데이터베이스 |
| S3 |
객체 스토리지 |
| SNS |
Pub/Sub 알림 서비스 |
| SQS |
메시지 큐 서비스 |
| EventBridge |
이벤트 버스와 스케줄링 |
| Step Functions |
워크플로 오케스트레이션 |
| Aurora Serverless |
자동 확장 관계형 데이터베이스 |
| Fargate |
서버 관리 없는 컨테이너 실행 |
| AppSync |
GraphQL API |
| Cognito |
애플리케이션 사용자 인증 |
| SAM |
서버리스 애플리케이션 IaC 프레임워크 |
Lambda
핵심 개념
- Lambda는 서버를 직접 관리하지 않고 코드를 실행할 수 있는 서버리스 컴퓨팅 서비스
- 이벤트가 발생하면 Lambda 함수가 실행됨
- 요청 수와 실행 시간에 따라 과금
- 짧고 독립적인 이벤트 기반 작업에 적합
- API 처리, 파일 처리, 데이터 변경 후속 처리, 스트리밍 이벤트 처리, 스케줄 작업 등에 사용
- Lambda는 상태를 오래 유지하는 서버보다는 Stateless 함수 실행 모델에 적합
- 장기 실행 작업이나 OS 수준 제어가 필요한 작업에는 적합하지 않을 수 있음
Lambda 핵심 스펙
| 항목 |
내용 |
| 최대 실행 시간 |
15분 |
| 최대 메모리 |
10,240MB |
| 메모리 설정 범위 |
128MB ~ 10,240MB |
| 언어 지원 |
Node.js, Python, Java, Go, Ruby, .NET 등 |
| 과금 |
요청 횟수 + 실행 시간 기준 |
| 실행 모델 |
이벤트 기반 실행 |
| 기본 동시성 |
계정/리전 단위 동시성 한도 내에서 자동 확장 |
- Lambda 메모리는 10,000MB가 아니라 10,240MB까지 설정 가능
- 메모리를 늘리면 CPU 성능도 함께 증가
- 단일 호출은 최대 15분까지만 실행 가능
- 15분 이상 실행이 필요한 작업은 ECS/Fargate, AWS Batch, Step Functions를 함께 고려
Lambda 동시성
예약된 동시성
- Reserved Concurrency는 특정 Lambda 함수가 사용할 수 있는 최대 동시 실행 수를 예약하고 제한하는 기능
- 특정 함수가 계정 전체 동시성을 모두 사용하지 못하게 제한할 수 있음
- 동시에 해당 함수에 최소한의 동시성 용량을 보장하는 효과도 있음
- 하지만 예약된 동시성은 콜드 스타트 자체를 줄이는 기능은 아님
프로비저닝된 동시성
- Provisioned Concurrency는 Lambda 실행 환경을 미리 초기화해두는 기능
- 콜드 스타트 지연을 줄이고 싶을 때 사용
- 지연 시간에 민감한 API나 사용자 요청 처리에 적합
- 단, 미리 준비된 실행 환경에 대한 비용이 발생할 수 있음
동시성 관련 선택
| 요구사항 |
적합한 기능 |
| 특정 함수의 최대 동시 실행 수 제한 |
Reserved Concurrency |
| 특정 함수에 동시성 용량 보장 |
Reserved Concurrency |
| 콜드 스타트 지연 감소 |
Provisioned Concurrency |
| 트래픽 급증 시 백엔드 완충 |
SQS + Lambda |
| 처리량 제어 |
SQS 이벤트 소스 매핑, Reserved Concurrency |
Lambda@Edge
- Lambda@Edge는 CloudFront 엣지 로케이션에서 Lambda 함수를 실행하는 기능
- CloudFront 요청/응답 흐름 중 특정 시점에 코드를 실행할 수 있음
- Viewer Request, Viewer Response, Origin Request, Origin Response 단계에서 요청 또는 응답 수정 가능
- 인증, URL 리다이렉트, A/B 테스트, 헤더 조작, 응답 변환 등에 사용
- 글로벌 사용자에게 가까운 엣지에서 로직을 처리할 수 있음
- 가벼운 헤더 수정이나 리다이렉트는 CloudFront Functions가 더 적합한 경우도 있음
- Lambda@Edge는 일반 Lambda와 배포 방식, 리전, 제약 조건이 다르므로 구분 필요
Lambda 주요 이벤트 소스 패턴
| 패턴 |
설명 |
| API Gateway + Lambda |
REST/HTTP 서버리스 API 구성 |
| S3 Event + Lambda |
객체 업로드 후 이미지 처리, 파일 변환, 썸네일 생성 |
| DynamoDB Streams + Lambda |
테이블 변경 이벤트 기반 후속 처리 |
| Kinesis Data Streams + Lambda |
실시간 스트리밍 데이터 처리 |
| SQS + Lambda |
안정적인 비동기 메시지 처리 |
| EventBridge + Lambda |
이벤트 기반 스케줄링 또는 서비스 이벤트 처리 |
| SNS + Lambda |
알림 이벤트 후속 실행 |
| Cognito + Lambda Trigger |
사용자 인증 흐름 중 커스텀 로직 실행 |
- API Gateway + Lambda는 서버리스 API 구성에 자주 사용
- S3 Event + Lambda는 이미지 리사이징, 썸네일 생성, 파일 변환 등에 적합
- DynamoDB Streams + Lambda는 CDC 패턴으로 테이블 변경에 대한 후속 처리를 구현할 때 사용
- SQS + Lambda는 실패 재처리와 트래픽 완충이 필요한 비동기 처리에 적합
- EventBridge + Lambda는 특정 시간 또는 AWS 서비스 이벤트 기반 자동화에 적합
Lambda 실패 처리와 재처리
- Lambda 호출 방식에 따라 실패 처리 방식이 달라짐
- 동기 호출은 호출한 클라이언트가 오류 응답을 받음
- 비동기 호출은 Lambda가 내부적으로 재시도할 수 있음
- SQS 이벤트 소스 매핑에서는 Lambda가 SQS 큐를 폴링하고, 성공적으로 처리된 메시지를 큐에서 삭제함
- Lambda가 SQS 메시지 처리를 실패하면 메시지는 가시성 타임아웃 이후 다시 큐에 나타나 재처리 가능
- 반복 실패 메시지는 SQS DLQ로 보내 분석할 수 있음
- Lambda 처리 실패로 인한 데이터 유실이 걱정되면 SQS를 앞단에 두어 재처리 가능한 구조를 고려
- SQS를 사용할 때는 Lambda timeout과 SQS visibility timeout을 함께 설계해야 함
- AWS는 SQS 이벤트 소스 매핑에서 큐의 visibility timeout을 Lambda 함수 timeout보다 충분히 길게 설정하도록 권장함
API Gateway + Lambda 패턴
[Client] → [API Gateway] → [Lambda] → [DynamoDB / S3 / RDS]
- 완전한 서버리스 API 아키텍처를 구성할 수 있음
- API Gateway는 클라이언트 요청을 받고 인증, 권한 부여, 요청 제한, 로깅 등을 처리
- Lambda는 비즈니스 로직을 실행
- DynamoDB, S3, RDS, Aurora Serverless 등과 연동 가능
- API Gateway 캐싱을 사용하면 동일 요청에 대한 Lambda 호출 횟수를 줄일 수 있음
- 실시간 양방향 통신이 필요하면 API Gateway WebSocket API를 고려
S3 Event + Lambda 패턴
[S3 업로드] → [S3 Event] → [SQS] → [Lambda]
- 객체 업로드 시 자동으로 Lambda를 트리거할 수 있음
- 이미지 리사이징, 썸네일 생성, 파일 변환, 메타데이터 추출, 데이터 처리 등에 적합
- S3 이벤트를 Lambda에 직접 연결할 수도 있음
- 안정적인 재처리와 완충이 중요하면 S3 Event → SQS → Lambda 구조를 고려
- SQS를 사이에 두면 이벤트를 큐에 보관하고, Lambda 실패 시 재처리하기 쉬움
- 대량 업로드나 갑작스러운 이벤트 증가가 예상되면 SQS를 통해 Lambda 처리량을 완충하는 구조가 유용
DynamoDB Streams + Lambda
[DynamoDB INSERT/UPDATE/DELETE] → [DynamoDB Streams] → [Lambda] → [후속 시스템]
- DynamoDB Streams는 테이블 변경 이벤트를 기록하는 기능
- INSERT, MODIFY, REMOVE 이벤트를 기반으로 Lambda를 트리거할 수 있음
- CDC, 즉 Change Data Capture 패턴에 사용
- 테이블 변경 후 알림 발송, 검색 인덱스 갱신, 집계 테이블 업데이트, 다른 시스템 동기화 등에 적합
- DynamoDB Streams 레코드는 24시간 동안 보관됨
- 장기간 이벤트 보관이나 재처리가 필요하면 별도 저장소나 스트리밍 서비스를 함께 고려
Kinesis Data Streams + Lambda
[Producer] → [Kinesis Data Streams] → [Lambda] → [후속 처리]
- 실시간 스트리밍 데이터를 서버리스로 처리할 때 사용
- 로그, 클릭스트림, IoT 이벤트, 실시간 분석 이벤트 처리에 적합
- Lambda는 Kinesis 샤드에서 레코드를 배치 단위로 읽어 처리
- 여러 소비자가 같은 스트림을 독립적으로 처리해야 하는 경우 Kinesis Data Streams가 적합
- 단순 작업 큐와 재처리 중심이면 SQS가 더 적합
EventBridge + Lambda
[AWS 서비스 이벤트 / SaaS 이벤트 / 스케줄] → [EventBridge] → [Lambda]
- AWS 서비스 이벤트, 사용자 애플리케이션 이벤트, SaaS 이벤트를 규칙 기반으로 Lambda에 전달 가능
- 특정 시간 또는 주기 기반 작업 실행에 사용
- EC2 상태 변경, 보안 이벤트, 배포 이벤트 등에 반응하는 운영 자동화에 적합
- EventBridge Scheduler를 사용하면 크론 표현식 또는 비율 기반으로 작업 예약 가능
SNS + Lambda
[Publisher] → [SNS Topic] → [Lambda]
- SNS Topic에 발행된 메시지를 Lambda가 구독하여 후속 처리 가능
- 알림 이벤트를 기반으로 여러 Lambda 또는 SQS 큐에 동시에 전달 가능
- 하나의 이벤트를 여러 서비스가 병렬로 처리해야 하면 SNS Fan-out 패턴을 고려
Cognito + Lambda Trigger
- Cognito User Pool은 사용자 가입, 로그인, 인증 흐름을 관리
- Lambda Trigger를 사용하면 Cognito 인증 흐름 중 커스텀 로직을 실행할 수 있음
- 예를 들어 회원가입 전 검증, 가입 후 사용자 프로필 생성, 토큰 커스터마이징, 사용자 마이그레이션 등에 사용
- 애플리케이션 사용자 인증 로직을 확장해야 할 때 유용
SAM
핵심 개념
- SAM은 Serverless Application Model의 약자
- Lambda, API Gateway, DynamoDB 등 서버리스 애플리케이션을 Infrastructure as Code 방식으로 정의하고 배포하는 프레임워크
- CloudFormation 위에서 동작하는 서버리스 애플리케이션용 추상화 레이어
- SAM 템플릿은 CloudFormation 템플릿의 확장이며, 서버리스 리소스를 더 간결하게 정의할 수 있음
- AWS SAM CLI를 사용해 로컬 테스트, 빌드, 패키징, 배포를 수행할 수 있음
- sam local invoke를 사용하면 Lambda 함수를 로컬에서 테스트할 수 있음
- 서버리스 애플리케이션의 개발과 배포 사이클을 빠르게 만들 때 유용
SAM 사용 흐름
SAM Template 작성 → sam build → sam local test → sam deploy
- 템플릿으로 Lambda, API Gateway, 권한, 이벤트 소스 등을 정의
- 로컬에서 함수 실행과 이벤트 테스트 가능
- 배포 시 CloudFormation 스택으로 변환되어 리소스 생성
- 서버리스 애플리케이션을 반복적으로 배포하고 관리하기에 적합
서버리스 vs 컨테이너 비교
| 항목 |
Lambda |
ECS/Fargate |
| 실행 단위 |
함수 |
컨테이너 |
| 실행 시간 |
최대 15분 |
컨테이너가 실행되는 동안 지속 가능 |
| 서버 관리 |
불필요 |
Fargate 사용 시 서버 관리 불필요 |
| 실행 환경 |
Lambda 런타임 또는 컨테이너 이미지 |
사용자가 컨테이너 이미지 정의 |
| 콜드 스타트 |
발생 가능 |
Lambda와 같은 함수 콜드 스타트 개념은 아니지만, 태스크 시작 시간은 존재 |
| 비용 |
요청 횟수와 실행 시간 기준 |
vCPU/메모리 실행 시간 기준 |
| 적합한 워크로드 |
짧은 이벤트 기반 처리 |
장기 실행 작업, 커스텀 런타임, 컨테이너 기반 앱 |
- 15분 이상 실행이 필요한 작업은 Lambda보다 ECS/Fargate, AWS Batch 등을 고려
- 컨테이너 이미지 기반 실행 환경을 세밀하게 제어해야 하면 ECS/Fargate가 적합
- 이벤트 기반의 짧은 작업은 Lambda가 적합
- 서버를 직접 관리하고 싶지 않지만 컨테이너를 사용해야 하면 Fargate 고려
- 장기 실행 배치 작업은 AWS Batch도 함께 고려 가능
서버리스 아키텍처 선택 기준 요약
| 요구사항 |
적합한 서비스 |
| 짧은 이벤트 기반 코드 실행 |
Lambda |
| REST/HTTP API 제공 |
API Gateway |
| 실시간 양방향 API |
API Gateway WebSocket API |
| 서버리스 NoSQL 데이터베이스 |
DynamoDB |
| 객체 저장과 이벤트 트리거 |
S3 |
| 메시지 큐 기반 비동기 처리 |
SQS |
| Pub/Sub 알림과 팬아웃 |
SNS |
| 이벤트 라우팅과 스케줄링 |
EventBridge |
| 다단계 워크플로 오케스트레이션 |
Step Functions |
| 서버리스 GraphQL API |
AppSync |
| 애플리케이션 사용자 인증 |
Cognito |
| 서버리스 관계형 DB 자동 확장 |
Aurora Serverless |
| 서버 관리 없는 컨테이너 실행 |
Fargate |
| 서버리스 IaC 프레임워크 |
SAM |
| 15분 이상 실행되는 컨테이너 작업 |
ECS/Fargate 또는 AWS Batch |