"Rate exceeded" 및 429 "TooManyRequestsException" 오류가 발생한 Lambda 함수 조절 문제를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 2월 20일

AWS Lambda 함수에서 "Rate exceeded" 및 429 "TooManyRequestsException" 오류가 나타납니다. 함수가 조절되고 있는 이유는 무엇입니까?

간략한 설명

조절 현상은 리소스와 다운스트림 애플리케이션을 보호하기 위해 발생합니다. Lambda가 수신 트래픽을 수용하기 위해 자동으로 확장되더라도 다양한 이유로 인해 함수가 계속 조절될 수 있습니다. 다음 지침에 따라 문제를 해결하십시오.

​해결 방법

조절이 발생한 항목 확인

현재 보이는 조절 현상이 Lambda 함수에서 발생하는 것이 아닐 수 있습니다. 함수 호출 과정에서 API 호출에 대해 조절이 발생할 수도 있습니다.

  1. Amazon CloudWatch Logs에 조절 메시지가 나타나지만 Lambda Throttles 지표에는 해당 데이터 포인트가 없는 상황인지 확인하십시오. Lambda Throttles 지표가 없다면, Lambda 함수 코드의 API 호출에서 조절이 발생하고 있는 것입니다.
  2. 함수 코드에 조절된 API 호출이 있는지 확인하십시오. 특정 API 호출이 조절되고 있으면 반드시 코드의 지수 백오프를 사용하여 API 호출을 재시도하십시오.
  3. API 호출에 더 높은 TPS(초당 트랜잭션) 할당량이 필요하다고 판단하는 경우에 할당량을 조정할 수 있다면 서비스 할당량 증가를 요청할 수 있습니다.

동시성 지표 확인

  1. Amazon CloudWatch의 Lambda 지표를 검토하십시오. 조절이 나타난 AWS 리전에서 함수에 대한 ConcurrentExecutions 지표를 확인하십시오.
  2. 동일한 타임스탬프를 기준으로 ConcurrentExecutions 지표와 Throttles 지표를 비교하십시오. (ConcurrentExecutions에 대해서는 Maximum 통계를 확인하고 Throttles에 대해서는 Sum 통계를 확인하십시오.) 최대 ConcurrentExecutionsThrottles 그래프의 해당 데이터 포인트와 함께 해당 리전의 계정 수준 동시성 할당량에 가까운지 확인하십시오.
  3. 현재 특정 리전에 대한 초기 버스트 동시성 할당량을 초과하고 있는지 여부를 확인하십시오. CloudWatch 콘솔의 Lambda에 대한 지표 페이지에서 그래프의 시간 범위를 1분으로 줄이십시오. 버스트 조정으로 인해 제한을 받는 경우 그래프상의 ConcurrentExecutions의 계단형 패턴에 대응하여 Throttles가 갑자기 급증하는 것을 볼 수 있습니다. 버스트 동시성 한도를 해결하기 위해서는 프로비저닝된 동시성을 구성할 수 있습니다.
  4. 함수에 대해 Duration 지표가 급증하는지 확인하십시오. 동시성은 함수 기간에 따라 달라집니다. 코드를 실행하는 데 너무 오래 걸리는 경우 컴퓨팅 리소스가 충분하지 않을 수 있습니다. 함수의 메모리 설정값을 늘려 보십시오. 그런 다음, AWS X-RayCloudWatch Logs를 사용하여 기간 급상승의 원인을 격리하십시오. 함수가 Amazon Virtual Private Cloud(Amazon VPC)에 있는 경우, 자세한 내용은 VPC에서 Lambda 함수에 인터넷 액세스 권한을 부여하려면 어떻게 해야 합니까?를 참조하십시오.
    참고: 메모리 설정값을 변경할 경우 실행 시간에 대해 발생하는 요금에 영향을 미칠 수 있습니다.
  5. 함수에 대해 Error 지표가 증가하는지 확인하십시오. 오류가 증가하면 재시도가 발생하고 호출이 전반적으로 증가할 수 있습니다. (비동기식 호출의 경우, Lambda는 실패한 호출을 두 번 더 재시도합니다.) 호출이 증가하면 동시성이 증가할 수 있습니다. CloudWatch Logs를 사용하여 오류를 식별 및 제거하고 함수 코드가 예외 사항을 처리하도록 하십시오.

예약된 동시성 구성

  1. Lambda 함수에 예약된 동시성을 구성했는지 확인하십시오. Lambda 콘솔을 사용하거나 GetFunction API를 호출하여 설정을 확인하십시오.
    참고: 함수가 예약된 동시성을 갖지 않도록 구성된 경우에는 이벤트를 처리할 수 없기 때문에 함수에 조절 현상이 발생합니다. 해당 값을 0보다 큰 숫자로 늘려야 합니다.
  2. 함수에 대한 CloudWatch Maximum 통계를 검토하여 그 값이 언제나 ConcurrentExecutions 지표의 최대값에 도달하는지 확인하십시오.
  3. 함수에 대한 예약된 동시성을 조절이 발생하지 않는 동시성 값으로 높이십시오. Lambda 콘솔을 이용하거나 PutFunctionConcurrency API를 호출하여 설정을 변경하십시오.

앱에서 지수 백오프 사용

가장 좋은 방법은 Lambda 함수를 호출하는 애플리케이션에서 지수 백오프를 사용하여 조절된 요청을 재시도하는 것입니다.

전송 배달 못한 편지 대기열 사용

Amazon Simple Storage Service(Amazon S3)Amazon CloudWatch Events와 같은 비동기식 이벤트 소스를 사용하고 있다면, 함수를 배달 못한 편지 대기열(DLQ)로 구성하여 지속되는 조절로 인해 폐기되는 이벤트가 있는지 파악하십시오. 상당한 양의 조절이 발생할 경우 이를 통해 데이터를 보호할 수 있습니다.

참고: Amazon Simple Queue Service(Amazon SQS) 이벤트 소스의 경우에는 DLQ를 Amazon SQS 대기열에 구성해야 합니다.

서비스 할당량 증가 요청

동시 실행을 위해 워크로드의 서비스 할당량을 높여야 한다고 판단하는 경우에는 서비스 할당량 콘솔에서 서비스 할당량 증가를 요청할 수 있습니다.