출처: ‣
1. 개념
- AWS Lambda는 서버리스 컴퓨팅에 속하는 AWS의 비공개 기술입니다.
- 서버리스 컴퓨팅은 수요에 대응되는 컴퓨팅 자원을 개발자의 작업 없이 알아서 제공합니다.
- AWS Lambda는 AWS 상에서 인프라 구성 없이도 자동으로 확장, 축소되는 인프라를 활용하기 위해 사용합니다.
2. 동작
- Lambda는 함수 한 개 단위로 등록, 실행되며 이를 Lambda Function이라고 합니다.
- 개발자가 handler 코드를 작성해 Lambda에 등록한 것이 Lambda Function입니다.
- handler는 event를 입력 받으며, event는 JSON 타입으로 전달됩니다.
export const handler = async (event, context) => { // some business logic const response = { statusCode: 200, body: JSON.stringify(/* ... */), }; return response; };
- Lambda Function을 실행하려면 타 AWS 서비스에서 이벤트를 발행해야 합니다.
- (ex) API Gateway에서 HTTP Request 전달
- 각 람다 별 HTTP URL을 생성해서 인터넷에서 직접 호출할 수도 있습니다.
- Lambda Function을 실행할 때 필요한 실행 환경은 실행 환경(Execution Environment)라고 합니다.
- 실행 환경은 Lambda Function 호출 시 생성되며, 핸들러 종료 시 제거됩니다.
- 실행 환경은 일정 기간 동안 실행 환경이 제거되지 않을 수 있으며, 이 경우 재호출 시 재사용합니다.
- 실행 환경을 생성하는 시간이 실행 시간에 영향을 미치므로, 최소한의 코드만으로 Lambda Function을 구성하는 게 좋습니다.
- Lambda Function 호출 시 재사용할 수 있는 실행 환경이 없으면 새로 생성하며, 이를 동시성(Concurrency)라고 합니다.
- 계정마다 동시성에 한도가 있으며 이는 AWS 문의를 통해 조절할 수 있습니다.
- (ex) 깡통 계정의 서울 리전 동시성 한도는 400.
- Lambda Function 호출 전에도 미리 실행 환경을 띄워놓을 수 있으며 이를 Provisioned Concurrency라고 합니다.
- 다만 EC2와 같이 계속 띄워놓는 방식으로 비용이 비쌉니다.
- Lambda Function은 사양에 따라 응답 속도의 편차가 큽니다.
- Main Memory에 비례해 vCPU의 스펙이 결정되기 때문입니다.
- 512MB = 0.5 vCPU
- 1,769MB = 1 vCPU
- Main memory에 거의 비례하는 속도 개선을 확인할 수 있습니다. (128MB vs 1024MB - 8배 차이)
- 따라서 성능 요건을 만족하는 최소 사양을 확인하고 선택해야 합니다.
3. 비용
출처: ‣
- 요금 = 컴퓨팅 시간 + 실행 횟수 + 프로비저닝된 동시성 요금 + (기타 요금)
- 컴퓨팅 시간 = GB-s 단위(인스턴스 사양 * 실행 시간)
- 프로비저닝된 동시성 요금 = (컴퓨팅 시간 비용의 약 1/3 정도)
- (기타 요금은 비중이 크지 않아서 생략)
- 임시 스토리지 요금
- SnapStart 요금
- 데이터 전송 요금
- Lambda@Edge 요금
- 프리 티어 (언제나 무료)
- 400,000 Gb-s
- (ex) 1GB * 200ms 이면 400,000 * 1,000 / 200 = 2백만 초 = 555Hr 정도 (약 23일 정도)
- 1,000,000만 회 호출
4. 제약
출처: ‣
- 실행 환경 인프라를 제어할 수 없습니다.
- 한 번에 15분까지만 실행 가능합니다.
- (ex) 실행에 20분이 걸리는 SQL은 실행 불가
- 단, 작업을 15분 이내의 작업으로 나눌 수 있는 경우 AWS Step Function을 활용해 실행할 수 있습니다.
- request/response payload 크기에 제한이 있습니다.
- (sync) request, response 각각 6MB 제한 (streaming 시 20MB)
- (async) 256KB
- 속도 제한이 있습니다.
- streaming response 시 6MB 이후부터 2Mbps 상한 적용
- 네트워크 연결이 제한됩니다.
- Inbound 연결이 차단됩니다.
- Outbound 전용 TCP, UDP 소켓으로만 통신이 가능합니다.
- 소스 코드 용량 제한이 있습니다.
- ZIP 파일 방식 = 압축 전 50MB, 압축 후 250MB
- 컨테이너 이미지 방식 = 10GB
- 실행 환경 용량 제한이 있습니다.
/tmp
폴더만 제공- 10GB (512MB까지 무료)
5. 적합한 경우 (vs EC2)
서버리스 특성 | 적합한 서비스 특성 | 적합한 예시 시나리오 |
응답의 크기, 길이 등이 작음 | HTTP API 서버로 운영할 때 | - |
무상태임 | HTTP API 서버로 운영할 때 | - |
자동 확장/축소됨 | 거의 사용량이 없다가 가끔 사용 | 혼자만 사용할 때, 가끔씩만 방문하는 Demo일 때 |
ㅤ | 사용량이 가끔 피크 | 시즌성 이벤트 시 |
ㅤ | 서비스 기능이 일회성 실행 | 프로필 이미지 리사이즈 작업 |
ㅤ | 외부 Web Hook을 입력으로 어떤 작업을 할 때 | 동기화 작업, CI/CD 작업 |
실행 시간이 최대 15분 이내 | 작업이 15분 이내의 배치성 | 매일 자정에 간단한 집계 실행 |
인스턴스가 꺼져있을 때에도 요청이 발생할 수 있음 (a.k.a. Cold Start) | 서비스 시작 시간이 짧음 | NodeJS를 사용할 때 |
확장이 빠르지만 상한선이 있고, 단위 비용이 높음 | 서비스 규모가 작음 | 사이드 프로젝트를 운영할 때 |
6. 추가 참고 자료
- 핵심 개념
- ‣
- 프로비저닝된 동시성
- ‣
- 사양 설정 가이드라인
- ‣
- 사양 별 성능 벤치마킹 도구
- 코드 예제
- ‣
- ‣
- ‣