Lambda durable functions 재시도

Lambda durable functions 재시도 (Retries for Lambda durable functions)

durable functions는 일시적 장애에 대해 애플리케이션을 회복력 있게 만드는 자동 재시도 기능을 제공해요. SDK는 두 수준에서 재시도를 처리해요 — 비즈니스 로직 실패에 대한 스텝 재시도(step retries) 와 인프라 실패에 대한 백엔드 재시도(backend retries).

출처: AWS Lambda 개발자 안내서

본문

스텝 재시도

스텝 내에서 잡히지 않은 예외가 발생하면 SDK는 구성된 재시도 전략에 따라 스텝을 자동으로 재시도해요. 스텝 재시도는 체크포인트 작업이어서 SDK가 실행을 일시 중지하고 진행 상황을 잃지 않고 나중에 재개할 수 있어요.

스텝 재시도 동작

다음 표는 SDK가 스텝 내 예외를 처리하는 방법을 설명해요.

시나리오 어떤 일이 일어나나 계량 영향
재시도 횟수가 남은 스텝의 예외 SDK가 재시도를 위한 체크포인트를 만들고 함수를 일시 중지합니다. 다음 호출에서 스텝은 구성된 백오프 지연으로 재시도합니다. 1 operation + 오류 payload 크기
재시도 횟수가 없는 스텝의 예외 스텝이 실패하고 예외를 던집니다. 핸들러 코드가 이 예외를 잡지 않으면 전체 실행이 실패합니다. 1 operation + 오류 payload 크기

스텝이 재시도해야 할 때 SDK는 재시도 상태를 체크포인트하고 다른 실행 중인 작업이 없으면 Lambda 호출을 종료해요. 이렇게 하면 SDK가 컴퓨팅 리소스를 소비하지 않고 백오프 지연을 구현할 수 있어요. 함수는 백오프 기간 후 자동으로 재개돼요.

스텝 재시도 전략 구성

재시도 전략을 구성해 스텝이 실패를 처리하는 방식을 제어해요. 최대 시도 횟수, 백오프 간격, 재시도 조건을 지정할 수 있어요. 재시도 전략 헬퍼, 프리셋, 커스텀 전략의 전체 참조는 Durable Execution SDK 문서의 Retries를 참고하세요.

스텝 밖의 예외

핸들러 코드에서 스텝 밖에서 잡히지 않은 예외가 발생하면 SDK는 실행을 실패로 표시해요. 이렇게 하면 애플리케이션 로직의 오류가 제대로 캡처되고 보고됩니다.

시나리오 어떤 일이 일어나나 계량 영향
스텝 밖 핸들러 코드의 예외 SDK가 실행을 FAILED로 표시하고 오류를 반환합니다. 예외는 자동으로 재시도되지 않습니다. 오류 payload 크기

오류가 발생하기 쉬운 코드에 자동 재시도를 활성화하려면 재시도 전략이 있는 스텝으로 감싸요. 스텝은 구성 가능한 백오프로 자동 재시도를 제공하고, 스텝 밖의 코드는 즉시 실패해요.

호출 재시도

호출 수준 재시도는 Lambda durable function이 어떻게 호출되는지에 따라 다르게 처리돼요. 다음 표는 서로 다른 호출 유형이 호출 수준 재시도에 어떤 영향을 줄 수 있는지 설명해요.

호출 유형 어떤 일이 일어나나
동기 호출 Lambda는 durable function 실행 중 오류 시 호출을 자동으로 재시도하지 않습니다. 호출 실패에 대한 재시도는 동기 호출의 소스에 따라 달라집니다. 예를 들어 AWS SDK를 사용하면 InternalFailure와 ThrottlingException이 기본적으로 자동 재시도됩니다.
비동기 호출 durable function 실행이 실패하면(예: FAILED, STOPPED, TIMED_OUT 상태), Lambda는 실행을 재시도하지 않습니다. 이는 비동기 호출 실패 시 Lambda가 함수를 재시도하는 표준 Lambda 함수와 다릅니다. 비동기 호출의 MaximumRetryAttempts 설정은 durable execution에 적용되지 않습니다. 함수에 데드 레터 큐(DLQ)를 구성했다면 Lambda가 트리거 이벤트를 DLQ로 보냅니다.
ESM(이벤트 소스 매핑) Lambda는 기본적으로 전체 배치를 성공할 때까지 재시도합니다. 스트림 소스(DynamoDB와 Kinesis)의 경우 함수가 오류를 반환할 때 Lambda가 재시도하는 최대 횟수를 구성할 수 있습니다. Amazon SQS ESM의 경우 원래 Amazon SQS 큐의 DLQ로 최대 재시도를 구성할 수 있습니다. 모범 사례로 함수 수준 DLQ를 고려하고, Lambda가 실패한 트리거 이벤트를 DLQ로 보내게 할 수 있습니다.
직접 트리거 이는 "트리거"에 따라 다릅니다. 예를 들어 Lambda는 Amazon S3 이벤트 알림으로 트리거된 함수를 비동기적으로 처리하고, Amazon SNS 이벤트 알림으로 트리거된 함수도 비동기적으로 처리합니다. 비동기 호출 재시도 동작은 위의 "비동기 호출" 표 항목과 같습니다. Amazon SNS가 Lambda에 도달할 수 없거나 메시지가 거부되면 Amazon SNS는 몇 시간에 걸쳐 간격을 늘려 재시도합니다. API Gateway는 Lambda를 동기적으로 호출하고 요청자에게 실제 오류 응답을 반환합니다. 동기 호출 재시도 동작은 위의 "동기 호출" 표 항목과 같습니다.

백엔드 재시도

백엔드 재시도는 Lambda가 인프라 실패, 런타임 오류를 만나거나 SDK가 durable execution 서비스와 통신할 수 없을 때 발생해요. Lambda는 이런 실패를 자동으로 재시도해 durable function이 일시적 인프라 문제에서 회복되도록 도와요.

백엔드 재시도 시나리오

Lambda는 다음 시나리오를 만나면 함수를 자동으로 재시도해요.

  • 내부 서비스 오류 – Lambda나 durable execution 서비스가 5xx 오류를 반환할 때 (일시적 서비스 문제를 나타냄).
  • 스로틀링 – 동시성 한도나 서비스 할당량으로 함수가 스로틀될 때.
  • 타임아웃 – SDK가 타임아웃 기간 내에 durable execution 서비스에 도달하지 못할 때.
  • 샌드박스 초기화 실패 – Lambda가 실행 환경을 초기화하지 못할 때.
  • 런타임 오류 – Lambda 런타임이 함수 코드 밖의 오류(메모리 부족, 프로세스 크래시 등)를 만날 때.
  • 잘못된 체크포인트 토큰 오류 – 체크포인트 토큰이 더 이상 유효하지 않을 때 (보통 서비스 측 상태 변경 때문).

다음 표는 SDK가 이런 시나리오를 처리하는 방법을 설명해요.

시나리오 어떤 일이 일어나나 계량 영향
durable 핸들러 밖 런타임 오류(OOM, 타임아웃, 크래시) Lambda가 호출을 자동으로 재시도합니다. SDK가 마지막 체크포인트부터 재생하며 완료된 스텝은 건너뜁니다. 오류 payload 크기 + 재시도당 1 operation
CheckpointDurableExecution / GetDurableExecutionState API 호출 시 서비스 오류(5xx) 또는 타임아웃 Lambda가 호출을 자동으로 재시도합니다. SDK가 마지막 체크포인트부터 재생합니다. 오류 payload 크기 + 재시도당 1 operation
CheckpointDurableExecution / GetDurableExecutionState API 호출 시 스로틀링(429) 또는 잘못된 체크포인트 토큰 Lambda가 지수 백오프로 호출을 자동으로 재시도합니다. SDK가 마지막 체크포인트부터 재생합니다. 오류 payload 크기 + 재시도당 1 operation
CheckpointDurableExecution / GetDurableExecutionState API 호출 시 클라이언트 오류(429와 잘못된 토큰을 제외한 4xx) SDK가 실행을 FAILED로 표시합니다. 오류가 영구적인 문제를 나타내므로 자동 재시도가 없습니다. 오류 payload 크기

백엔드 재시도는 지수 백오프를 사용하고 함수가 성공하거나 실행 타임아웃에 도달할 때까지 계속됩니다. 재생 중 SDK는 완료된 체크포인트를 건너뛰고 마지막 성공 작업부터 실행을 계속해, 함수가 완료된 작업을 재실행하지 않게 합니다.

재시도 모범 사례

재시도 전략을 구성할 때 다음 모범 사례를 따르세요.

  • 명시적 재시도 전략 구성 – 프로덕션에서 기본 재시도 동작에 의존하지 마세요. 사용 사례에 맞는 적절한 최대 시도 횟수와 백오프 간격으로 명시적 재시도 전략을 구성하세요.
  • 조건부 재시도 사용 – shouldRetry 로직을 구현해 일시적 오류(비율 제한, 타임아웃)만 재시도하고 영구 오류(검증 실패, 찾을 수 없음)에는 빠르게 실패하세요.
  • 적절한 최대 시도 횟수 설정 – 회복력과 실행 시간 사이의 균형을 맞추세요. 재시도가 너무 많으면 실패 감지가 지연되고, 너무 적으면 불필요한 실패가 생길 수 있습니다.
  • 지수 백오프 사용 – 지수 백오프는 다운스트림 서비스의 부하를 줄이고 일시적 실패에서 회복될 가능성을 높입니다.
  • 오류가 발생하기 쉬운 코드를 스텝으로 감싸기 – 스텝 밖의 코드는 자동으로 재시도될 수 없습니다. 외부 API 호출, 데이터베이스 쿼리 등 오류가 발생하기 쉬운 작업을 재시도 전략이 있는 스텝으로 감싸세요.
  • 재시도 지표 모니터링 – Amazon CloudWatch에서 스텝 재시도 작업과 실행 실패를 추적해 패턴을 식별하고 재시도 전략을 최적화하세요.

더 알아보기 (Learn more)