Programming

[AWS, Certified Developer Associate] Lambda - 함수 구성, 성능개선, 동시성, 제한

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

Udemy - AWS Certified Developer Associate 시험 합격을 위한 모든 것!