비동기 호출에서 Lambda가 오류와 재시도를 처리하는 방법
비동기 호출에서 Lambda가 오류와 재시도를 처리하는 방법
Lambda는 함수의 비동기 이벤트 큐를 관리하고 오류가 발생하면 재시도를 시도해요. 함수가 오류를 반환하면 기본적으로 Lambda는 함수를 두 번 더 실행하려고 시도하며, 첫 번째와 두 번째 시도 사이에는 1분, 두 번째와 세 번째 시도 사이에는 2분을 기다립니다. 함수 오류에는 함수 코드가 반환하는 오류와 타임아웃 같은 함수 런타임이 반환하는 오류가 모두 포함됩니다.
본문
함수가 모든 이벤트를 처리할 만큼 충분한 동시성(concurrency)을 확보하지 못하면 추가 요청은 스로틀링됩니다. 스로틀링 오류(429)와 시스템 오류(500 계열)에 대해 Lambda는 이벤트를 큐에 돌려보내고, 기본적으로 최대 6시간 동안 함수를 다시 실행하려고 시도합니다. 재시도 간격은 첫 시도 후 1초부터 최대 5분까지 기하급수적으로 늘어납니다. 큐에 항목이 많으면 Lambda는 재시도 간격을 늘리고 큐에서 이벤트를 읽는 속도를 줄입니다.
함수가 오류를 반환하지 않더라도, 큐 자체가 최종적으로 일관된(eventually consistent) 특성을 갖기 때문에 함수가 Lambda로부터 동일한 이벤트를 여러 번 받을 수 있어요. 함수가 들어오는 이벤트를 따라잡지 못하면 이벤트가 함수로 전송되지 않은 채 큐에서 삭제될 수도 있습니다. 함수 코드가 중복 이벤트를 정상적으로 처리하고, 모든 호출을 처리할 수 있는 충분한 동시성이 있는지 확인하세요.
큐가 매우 길어지면 Lambda가 함수로 전송하기 전에 새 이벤트가 만료될 수 있어요. 이벤트가 만료되거나 모든 처리 시도를 실패하면 Lambda는 해당 이벤트를 버립니다. Lambda가 수행하는 재시도 횟수를 줄이거나 처리되지 않은 이벤트를 더 빨리 버리도록 함수의 오류 처리를 구성할 수 있어요. 버려진 이벤트를 캡처하려면 함수에 데드 레터 큐(dead-letter queue)를 구성하세요. 실패한 호출(타임아웃이나 런타임 오류 같은)의 기록을 캡처하려면 on-failure 대상(destination)을 만드세요.