Lambda - 함수 구성 (Function Configuration)
- RAM
- 128MB ~ 10GB까지 설정 가능 (1MB 단위 증가)
- 램을 증가하면 vCPU도 자동으로 증가 (직접 설정 불가)
- RAM이 1792MB일 때 함수는 1개의 완전한 vCPU를 가짐
- 1792MB 이상이면 CPU가 1개 이상이 되므로 코드의 효율성을 위해 멀티스레딩을 적용해야함
- CPU intensive 앱이면 (복잡한 계산) -> RAM을 늘려 CPU 성능을 높여야함
- Timeout : 기본값 3초, 최대 900초까지 가능 (15분)
- 수행시간이 15분이 넘어간다면 람다는 좋은 활용사례가 아님 (Fargate, ECS, EC2 사용 권장)
Lambda - 함수 성능 개선
- 람다에는 Execution Context가 존재 > 초기화 오래걸리는 작업은 핸들러 바깥에 두어 함수 간 재사용
- 람다 코드의 외부 의존성을 시작하는 임시적인 런타임 환경
- DB 커넥션, HTTP client, SDK client 생성 등
- 다른 람다 함수 호출을 예상하며 해당 컨텍스트가 유지될 수 있음 (재사용 가능)
- 핸들러 바깥에 해당 초기화 작업을 두어 함수 간 재사용 가능하도록 성능 개선
// BAD case (매 함수마다 db 커넥션을 새로 맺는 과정을 거침)
import os
def get_user_handler(event, context):
DB_URL = os.getenv("DB_URL")
db_client = db.connect(DB_URL)
user = db_client_get(user_id = event["user_id"])
return user
// GOOD case (핸들러 외부에 db 커넥션을 두어 함수 간 재사용 가능. Execution Context)
import os
DB_URL = os.getenv("DB_URL")
db_client = db.connect(DB_URL)
def get_user_handler(event, context):
user = db_client_get(user_id = event["user_id"])
return user
- 람다에는 /tmp 임시 공간이 존재 > 람다 함수가 재실행 시에도 해당 공간은 유지됨
- 최대 512MB
- 임시로 저장두어야 하는 파일을 tmp에 저장해두고, 람다 함수 재실행 시 해당 tmp 공간에서 재사용하여 성능개선
- 영구저장이 필요한 파일은 tmp가 아닌 S3와 같은 스토리지 활용
- /tmp 내 데이터를 암호화하고자 한다면 KMS 활용 (KMS Data key 생성 및 해당 키로 암호화)
Lambda - 동시성 (Concurrency)
- 동시성 제한 : 최대 1000
- 람다 함수의 동시성을 제한하기 위해 함수 레벨에서 예약된 동시성 (Reserved Concurrency, = limit) 설정 가능
- 예약된 동시성을 초과하는 호출에 대해서는 쓰로틀 트리거
- 동기식 : 429 쓰로틀 에러 응답
- 비동기식 : 자동 재시도 및 DLQ 이동
- 1000개 이상의 동시성이 필요한 경우 지원 티켓을 열어 더 높은 제한 요청 가능
- 동시성 제한을 설정하지 않을 경우 다음과 같은 이슈 발생
- 하나의 함수에서 1000개 동시성을 모두 사용했을 경우 다른 함수에까지 쓰로틀링이 걸림
- 콜드 스타트
- 새로운 람다 함수 인스턴스 생성 시 초기화 작업 (코드 로드, 외부 의존성, SDK 등) 에 오랜 시간이 소요됨
- 새로운 인스턴스에 들어오는 첫번째 요청이 이후 요청보다 지연시간이 길어지는 문제
- 이를 위해 프로비저닝된 동시성 설정 가능
- 프로비저닝 된 동시성 (Provisioned Concurrency)
- 함수 호출 전 동시성 할당
- 콜드 스타트 발생 X / 모든 호출의 지연시간 감소
- 애플리케이션 오토 스케일링 사용 가능 (대상에 대해 충분한 동시성이 예약되어 있는지 확인, 자동 스케일링)
Lambda - 제한
- 실행 (Execution)
- 메모리 할당 : 128MB ~ 10GB (1MB 단위 증가)
- 최대 실행시간 : 15분 (900초), 이상 실행된다면 람다 활용 권장 X
- 환경변수 : 최대 4KB
- /tmp 공간 : 512MB
- 동시 실행 : 1000건 (지원 티켓을 통해 증가 가능)
- 배포 (Deploy)
- 함수 배포 zip 파일 : 50MB
- 함수 배포 미압축 파일 (code + 의존성) : 250MB
- 그 이상의 파일인 경우 /tmp 공간 사용
- 환경변수 : 최대 4KB
Reference