Lambda 함수 구성

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

Claudio Canales

Senior DevOps Engineer

구성이 중요한 이유

  • 동일한 코드도 설정에 따라 동작이 크게 달라집니다.
  • 구성은 성능, 비용, 안전성을 결정합니다.
  • 개발 및 운영 환경에서 예측 가능한 동작을 목표로 합니다.

동일한 코드, 다른 설정

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

코드 vs 구성

코드 패키지

  • 코드 패키지
  • 핸들러 로직 + 의존성.
  • 변경 시 배포가 필요합니다.

함수 구성

  • 함수 구성
  • 메모리, 타임아웃, 환경 변수.
  • 실행 역할 + 레이어.
AWS Lambda로 구축하는 서버리스 애플리케이션

조정 가능한 설정 항목

  • 런타임 + 핸들러: Lambda가 실행할 코드를 지정합니다.
  • 메모리 + 타임아웃: 성능, 비용, 안전성을 결정합니다.
  • 환경 변수: 하드코딩 없이 설정을 관리합니다.
  • 실행 역할: AWS API 호출 권한을 부여합니다.
  • 레이어: 함수 간 공유 의존성을 제공합니다.

Lambda 구성 조정 항목

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

런타임과 핸들러 기본 개념

  • 런타임 = 언어 환경(예: Python).
  • 핸들러 = Lambda가 호출하는 진입점.
  • 핸들러 형식: file.function.
  • 예시: lambda_function.lambda_handler.

핸들러 문자열 구조

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

핸들러 문자열: 주의해야 할 오류

# lambda_function.py
def lambda_handler(event, context):
    return {"statusCode": 200}

임포트 후 핸들러 호출 흐름

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

실행 역할(IAM)

  • IAM = Identity and Access Management(권한 관리).
  • 실행 역할은 함수가 수행할 수 있는 작업을 정의합니다.
  • 코드에서 호출 가능한 AWS API를 제어합니다.

키카드로 비유한 실행 역할

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

Lambda 레이어란?

  • 레이어는 함수에 연결하는 ZIP 파일입니다.
  • Lambda는 런타임 시 레이어 파일을 /opt 경로에 마운트합니다.
  • 공유 라이브러리와 공통 유틸리티에 레이어를 활용하세요.
  • 레이어를 한 번 업데이트하면 여러 함수에서 재사용할 수 있습니다.

/opt에 마운트된 레이어

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

런타임 시 레이어 위치

  • 함수 코드는 /var/task에 마운트됩니다.
  • 연결된 레이어는 /opt에 마운트됩니다.
  • Lambda는 /tmp 경로에 임시 폴더를 제공합니다.

런타임 폴더: /var/task, /opt, /tmp

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

메모리와 CPU의 관계

  • 메모리가 많을수록 CPU도 증가합니다.
  • CPU 집약적 작업의 실행 시간을 줄일 수 있습니다.
  • 총 비용은 실행 시간과 메모리 모두에 따라 결정됩니다.

메모리가 CPU에 미치는 영향

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

측정으로 메모리 튜닝하기

  • 적절한 기본값으로 시작하세요(예: 256 MB).
  • 실제 이벤트로 테스트하세요.
  • 메모리 크기별 실행 시간과 비용을 비교하세요.

메모리 스윕: 실행 시간과 비용 측정

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

타임아웃과 안전한 실행

  • 타임아웃은 무한 실행을 방지합니다.
  • 오래 걸리는 작업 전에 남은 시간을 확인하세요.
  • 적절한 경우 빠르게 실패하고 재시도하세요.

안전 타이머로서의 타임아웃

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

연습: 남은 실행 시간 확인하기

def lambda_handler(event, context):
    time_left = context.get_remaining_time_in_millis()
    if time_left < 500:
        raise TimeoutError("Not enough time left")
    return {"statusCode": 200}

컨텍스트 카운트다운 가드

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

환경 변수

  • 설정 값을 코드에 직접 넣지 마세요.
  • dev/test/prod 설정을 분리하세요.
  • 민감한 값은 Secrets Manager를 사용하세요.

동작을 구성하는 환경 변수

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

연습: 환경 변수 읽기

import os

STAGE = os.getenv("STAGE", "dev")
LOG_LEVEL = os.getenv(
    "LOG_LEVEL", "INFO"
)

기본값으로 로컬 테스트를 안전하게

  • 환경 변수에 접근하려면 os를 임포트하세요.
  • os.getenv는 값이 없으면 기본값을 반환합니다.
AWS Lambda로 구축하는 서버리스 애플리케이션

흔한 구성 실수

  • 스테이지 값을 코드에 하드코딩하는 경우.
  • 타임아웃이 너무 짧거나 IAM 권한이 누락된 경우.
  • 민감한 정보를 일반 환경 변수에 저장하는 경우.

주의 사항과 모범 사례

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

연습해 봅시다!

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

Preparing Video For Download...