Lambda 실행 모델 이해하기

AWS Lambda로 구축하는 서버리스 애플리케이션

Claudio Canales

Senior DevOps Engineer

자동 실행

이벤트 기반 AWS

  • Lambda는 이벤트가 발생할 때 코드를 실행합니다.
  • 예시: S3 업로드 -> 이미지 리사이즈.
  • 트리거는 달라도 패턴은 동일합니다.
AWS Lambda로 구축하는 서버리스 애플리케이션

트리거 전까지 대기

유휴 -> 이벤트 -> 실행 -> 중지

  • 유휴 상태: 아무것도 실행되지 않습니다.
  • 이벤트 발생 시: 핸들러가 실행되고 종료됩니다.

Lambda의 모션 센서 조명 비유

  • 모션 센서 조명처럼 트리거 전까지 대기합니다.
  • 트리거가 "off"를 "on"으로 전환합니다.
AWS Lambda로 구축하는 서버리스 애플리케이션

AWS Lambda란?

AWS Lambda 한눈에 보기

  • 이벤트 기반 컴퓨팅 서비스입니다.
  • 수요에 따라 자동으로 확장됩니다.
  • 사용한 실행 시간만큼만 비용을 지불합니다.
AWS Lambda로 구축하는 서버리스 애플리케이션

Lambda의 코드 실행 방식

Lambda 실행 흐름

  • 이벤트 소스가 Lambda를 트리거합니다.
  • Lambda가 이벤트 페이로드를 핸들러에 전달합니다.
  • 핸들러가 결과를 반환합니다.
AWS Lambda로 구축하는 서버리스 애플리케이션

수요에 따른 스케일링

스케일링 시 환경 추가 생성

  • 이벤트가 많을수록 병렬 호출이 늘어납니다.
  • Lambda가 더 많은 환경을 생성합니다.
  • 새 환경마다 콜드 스타트가 발생할 수 있습니다.
AWS Lambda로 구축하는 서버리스 애플리케이션

핸들러 함수

def lambda_handler(event, context):
    # Your code here
    return {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }
  • event: 입력 페이로드 (JSON).
  • context: 런타임 메타데이터.
  • return: 출력 (또는 성공/실패).

핸들러가 event와 context를 수신

AWS Lambda로 구축하는 서버리스 애플리케이션

이벤트 객체

객체 스토리지 이벤트 페이로드

S3 이벤트: 버킷 + 객체 키.

# event["Records"][0]["s3"]
{
  "bucket": {"name": "my-bucket"},
  "object": {"key": "data.csv"}
}
  • 공통 작업: 필요한 데이터를 추출합니다.

HTTP 요청 이벤트 페이로드

API 이벤트: 메서드, 경로, 본문.

# API request event
{
  "httpMethod": "POST",
  "path": "/users",
  "body": "{\"name\": \"John\"}"
}
  • 트리거마다 JSON 형식이 다릅니다.
AWS Lambda로 구축하는 서버리스 애플리케이션

컨텍스트 객체

def lambda_handler(event, context):
    time_left = (
        context.get_remaining_time_in_millis()
    )
    request_id = context.aws_request_id
  • get_remaining_time_in_millis 타임아웃까지 남은 시간.
  • aws_request_id 로그 추적용 요청 ID.
AWS Lambda로 구축하는 서버리스 애플리케이션

상태 비저장 실행

웜 스타트 재사용 vs 초기화

  • 각 호출은 독립적으로 실행됩니다.
  • 환경 재사용은 가능하지만 보장되지 않습니다.
  • 상태는 Lambda 외부에 저장하세요.
counter = 0

def lambda_handler(event, context):
    global counter
    counter += 1  # may reset
    return counter
AWS Lambda로 구축하는 서버리스 애플리케이션

콜드 스타트

콜드 스타트 타임라인

  • 새 실행 환경을 생성합니다.
  • 코드와 의존성을 로드합니다.
  • 초기화를 실행한 후 핸들러를 실행합니다.
AWS Lambda로 구축하는 서버리스 애플리케이션

웜 스타트

웜 스타트 타임라인

  • 기존 환경을 재사용합니다.
  • 대부분의 초기화를 건너뜁니다.
  • 핸들러가 더 빨리 실행됩니다.
AWS Lambda로 구축하는 서버리스 애플리케이션

Init, 호출, 동결

실행 환경 수명 주기

  • Init은 환경당 한 번만 실행됩니다.
  • 핸들러는 호출마다 실행됩니다.
  • 실행 사이에 환경이 동결될 수 있습니다.
AWS Lambda로 구축하는 서버리스 애플리케이션

콜드 스타트 최적화

# init (once per env)
import boto3
s3 = boto3.client('s3')
# handler (every invocation)
def lambda_handler(event, context):
    return {"statusCode": 200}

Init은 한 번, 핸들러는 호출마다 실행

  • import 문과 SDK 클라이언트는 핸들러 밖에 배치하세요.
AWS Lambda로 구축하는 서버리스 애플리케이션

연습해 봅시다!

AWS Lambda로 구축하는 서버리스 애플리케이션

Preparing Video For Download...