이벤트 기반 아키텍처 핵심 개념

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

Claudio Canales

Senior DevOps Engineer

복습: Lambda 멘탈 모델

  • 이벤트 소스: Lambda를 트리거하는 대상.
  • 이벤트 페이로드: 발생한 일을 설명하는 JSON.
  • 핸들러: 이를 처리하는 코드.
  • 결과: 응답 또는 부수 효과.
  • 로그: 문제를 디버깅하는 공간.

Lambda 실행 흐름

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

이벤트는 메시지입니다

  • 이벤트는 발생한 일을 설명합니다.
  • 보통 메타데이터를 포함한 JSON 메시지입니다.
  • 핸들러는 필드를 추출하여 작업을 수행합니다.

이벤트의 초인종 비유

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

AWS의 주요 이벤트 소스

  • Amazon S3는 업로드 시 이벤트를 트리거합니다.
  • Amazon SQS는 메시지를 전달하는 관리형 큐입니다.
  • DynamoDB Streams는 변경 로그를 생성합니다.
  • 각 소스는 서로 다른 JSON 페이로드를 생성합니다.

이벤트 소스: S3 vs SQS vs Streams

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

동기식 vs 비동기식 호출

  • 동기식: 호출자가 결과를 기다립니다.
  • 비동기식: 호출자는 확인 응답만 받고, 이벤트는 나중에 처리됩니다.

동기 vs 비동기 비유

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

이벤트 기반 아키텍처 핵심 개념

  • 이벤트는 AWS 서비스로부터 JSON 형태로 전달됩니다.
  • 호출 방식에 따라 오류가 나타나는 위치가 달라집니다.
  • 페이로드는 소스마다 다르므로 방어적으로 파싱하고 검증하세요.
  • 재시도와 중복 전달을 기본 전제로 설계하세요.

핵심 정리 파이프라인

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

페이로드는 계약입니다

  • 페이로드는 계약입니다: 송신자가 구조를 결정합니다.
  • 핸들러는 필드의 위치를 알고 있어야 합니다.
  • 필요한 값을 추출하고, 검증하고, 처리한 뒤 로그를 남기세요.

페이로드 계약 및 파싱 워크플로

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

페이로드 예시: SQS 메시지 이벤트

주석이 달린 SQS 이벤트 페이로드

  • Records는 배치입니다.
  • body는 문자열입니다.
  • messageId는 추적 및 중복 제거에 활용됩니다.
AWS Lambda로 구축하는 서버리스 애플리케이션

실습: Records 반복 처리

def lambda_handler(event, context):
    records = event.get("Records", [])
    for record in records:
        body = record.get("body", "")
        print("BODY:", body)
    return {"statusCode": 200}
  • 안전한 기본값으로 Records를 읽습니다.
  • 각 레코드를 순회하며 body를 추출합니다.
  • 필요한 내용을 로그로 남기고 반환합니다.

Records 반복 처리

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

실습: JSON body 안전하게 파싱하기

import json
def lambda_handler(event, context):
    records = event.get("Records") or [{}]
    body = records[0].get("body", "{}")
    payload = json.loads(body)
    oid = payload.get("order_id")
    return json.dumps({"order_id": oid})
  • body는 문자열이므로 json.loads로 파싱합니다.
  • "{}" 같은 안전한 기본값을 사용하세요.
  • order_id를 추출하고 json.dumps로 JSON을 반환합니다.

body 파싱 흐름

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

방어적 파싱 체크리스트

방어적 파싱 체크리스트

  • 새 이벤트 소스를 처음 다룰 때 이벤트 구조를 한 번 로그로 남기세요.
  • 선택적 필드에는 .get()과 기본값을 사용하세요.
  • 필수 필드를 검증하고 명확한 오류를 반환하세요.
  • 빈 배치와 누락된 키를 처리하세요.
AWS Lambda로 구축하는 서버리스 애플리케이션

재시도 및 중복 처리를 고려한 설계

  • 많은 이벤트 소스는 최소 1회 전달 방식을 사용합니다.
  • 중복 전달이 발생할 수 있습니다.
  • 두 번 처리해도 결과가 동일하도록 멱등성 핸들러를 설계하세요.

재시도 및 중복 처리

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

멱등성 실전 적용

  • messageId 또는 order_id 같은 고유 키를 선택합니다.
  • 처리된 키를 DynamoDB에 저장합니다.
  • 키가 존재하면 작업을 건너뜁니다.

멱등성 결정 흐름

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

핵심 정리

  • 이벤트는 AWS 서비스로부터 JSON 형태로 전달됩니다.
  • 호출 방식에 따라 오류가 나타나는 위치가 달라집니다.
  • 페이로드는 소스마다 다르므로 방어적으로 파싱하고 검증하세요.
  • 재시도와 중복 전달을 기본 전제로 설계하세요.

핵심 정리 파이프라인

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

연습해 봅시다!

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

Preparing Video For Download...