Lambda의 이벤트 소스 매핑 문제 해결하기
Lambda의 이벤트 소스 매핑 문제 해결하기
이벤트 소스 매핑과 관련된 Lambda 문제는 여러 서비스에 걸친 디버깅이 포함되기 때문에 더 복잡할 수 있어요. 게다가 사용하는 정확한 이벤트 소스에 따라 이벤트 소스 동작이 달라질 수 있습니다. 이 섹션은 이벤트 소스 매핑과 관련된 일반적인 문제를 나열하고, 이를 식별하고 해결하는 방법을 안내합니다.
본문
참고
이 섹션은 설명을 위해 Amazon SQS 이벤트 소스를 사용하지만, 원칙은 Lambda 함수에 메시지를 대기시키는 다른 이벤트 소스 매핑에도 적용됩니다.
스로틀링 식별 및 관리
Lambda에서 스로틀링은 함수 또는 계정의 동시성 한도에 도달할 때 발생합니다. Amazon SQS 큐에서 메시지를 읽는 Lambda 함수가 있는 다음 예시를 생각해 보세요. 이 Lambda 함수는 30초 호출을 시뮬레이션하고 배치 크기가 1입니다. 즉, 함수는 30초마다 메시지 1개만 처리합니다:
const doWork = (ms) => new Promise(resolve => setTimeout(resolve, ms))
exports.handler = async (event) => {
await doWork(30000)
}
이렇게 긴 호출 시간 때문에 메시지가 처리되는 것보다 더 빠르게 큐에 도착하기 시작합니다. 계정의 비예약 동시성이 100이라면 Lambda는 100개의 동시 실행까지 확장한 다음 스로틀링이 발생합니다. 이 패턴은 함수의 CloudWatch 지표에서 확인할 수 있습니다:
함수에 대한 CloudWatch 지표는 오류를 보여주지 않지만, Concurrent executions(동시 실행) 차트는 최대 동시성 100에 도달했음을 보여줍니다. 결과적으로 Throttles 차트가 스로틀링을 표시합니다.
CloudWatch 알람으로 스로틀링을 감지할 수 있고, 함수의 스로틀링 지표가 0보다 클 때마다 알람을 설정할 수 있어요. 스로틀링 문제를 식별한 후 해결 옵션은 몇 가지 있습니다:
- 이 리전에서 AWS Support에 동시성 증가를 요청합니다.
- 함수의 성능 문제를 식별해 처리 속도를 개선하고 따라서 처리량을 향상시킵니다.
- 함수의 배치 크기를 늘려 각 호출이 더 많은 메시지를 처리하게 합니다.
처리 함수의 오류
처리 함수가 오류를 던지면 Lambda는 메시지를 SQS 큐에 돌려보냅니다. Lambda는 규모에서 오류가 발생하지 않도록 함수의 확장을 방지합니다. CloudWatch의 다음 SQS 지표는 큐 처리에 문제가 있음을 나타냅니다:
특히 가장 오래된 메시지의 수명과 표시 중인 메시지 수가 둘 다 증가하고, 메시지가 삭제되지 않습니다. 큐는 계속 커지지만 메시지는 처리되지 않습니다. 처리 Lambda 함수의 CloudWatch 지표도 문제가 있음을 나타냅니다:
Error count 지표는 0이 아니고 증가하는 반면, Concurrent executions은 줄었고 스로틀링은 멈췄습니다. 이는 오류 때문에 Lambda가 함수 확장을 중단했음을 보여줍니다. 함수의 CloudWatch 로그는 오류 유형에 대한 세부 정보를 제공합니다.
이 문제는 오류를 일으키는 함수를 식별한 뒤 오류를 찾아 해결하면 해결할 수 있어요. 오류를 수정하고 새 함수 코드를 배포한 뒤에는 CloudWatch 지표가 처리가 회복됨을 보여줄 것입니다:
여기서 Error count 지표는 0으로 떨어지고 Success rate(성공률) 지표는 100%로 돌아갑니다. Concurrent executions 그래프에서 보듯 Lambda가 함수를 다시 확장하기 시작합니다.
백프레셔(backpressure) 식별 및 처리
이벤트 프로듀서가 Lambda 함수가 처리할 수 있는 것보다 일관되게 빠르게 SQS 큐에 메시지를 생성하면 백프레셔가 발생합니다. 이 경우 SQS 모니터링은 가장 오래된 메시지의 수명이 선형적으로 증가하고 근사 표시 중인 메시지 수(approximate number of messages visible)도 증가해야 합니다. CloudWatch 알람으로 큐의 백프레셔를 감지할 수 있어요.
백프레셔를 해결하는 단계는 워크로드에 따라 다릅니다. Lambda 함수의 처리 능력과 처리량을 늘리는 것이 주요 목표라면 몇 가지 옵션이 있습니다:
- 특정 리전에서 AWS Support에 동시성 증가를 요청합니다.
- 함수의 배치 크기를 늘려 각 호출이 더 많은 메시지를 처리하게 합니다.