Amazon DynamoDB 스트림에 대한 Lambda IteratorAge 지표가 증가하는 이유는 무엇입니까?

최종 업데이트 날짜: 2022년 9월 12일

Amazon DynamoDB 스트림에서 레코드를 사용할 때 AWS Lambda IteratorAge 지표가 급증합니다. 함수의 반복기 수명이 증가하는 이유는 무엇이며 이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

Lambda Iteratorage 지표는 레코드가 DynamoDB 스트림에 추가된 시점과 함수가 해당 레코드를 처리하는 시점 사이의 지연 시간을 측정합니다. IteratorAge가 증가한다는 것은 Lambda가 DynamoDB 스트림에 기록된 레코드를 효율적으로 처리하지 못한다는 의미입니다.

IteratorAge가 증가하는 주된 이유는 다음과 같습니다.

  • 호출 오류
  • 스로틀 발생
  • 낮은 Lambda 처리량(throughput)

해결 방법

호출 오류

Lambda는 레코드 배치를 순서대로 처리하고 오류 발생 시 재시도하도록 설계되었습니다. 따라서 함수가 호출될 때마다 오류를 반환하는 경우 Lambda는 계속 재시도합니다. 이 작업은 레코드가 만료되거나 이벤트 소스 매핑에서 구성한 최대 기간을 초과할 때까지 수행됩니다. DynamoDB 스트림 보존 기간은 24입니다. Lambda는 레코드가 만료될 때까지 최대 하루 동안 계속 재시도한 후 다음 레코드 배치로 이동합니다.

Lambda 오류 지표를 확인하여 호출 오류가 IteratorAge 급증의 근본 원인인지 확인합니다. 그렇다면 Lambda 로그를 확인하여 오류를 디버깅한 다음 코드를 수정합니다. 오류를 처리할 때 코드에 try-catch 문을 포함해야 합니다.

이벤트 소스 매핑 구성에는 IteratorAge 급증을 방지하는 데 도움이 되는 세 가지 파라미터가 있습니다.

  • 재시도 횟수: 함수가 오류를 반환할 때 Lambda가 재시도하는 최대 횟수입니다.
  • 최대 레코드 보존 기간 - Lambda가 함수로 전송하는 레코드의 최대 보존 기간입니다. 이는 너무 오래된 레코드를 폐기하는 데 도움이 됩니다.
  • 오류 시 배치 분할 - 함수가 오류를 반환하면 재시도하기 전에 배치를 두 개로 분할합니다. 더 작은 배치로 다시 시도하면 잘못된 레코드가 격리되고 제한 시간 초과 문제가 해결됩니다. 참고: 배치 분할은 재시도 할당량에 합산되지 않습니다.

폐기된 이벤트를 유지하려면 실패한 배치에 대한 세부 정보를 Amazon Simple Queue Service(Amazon SQS) 대기열로 보내도록 이벤트 소스 매핑을 구성합니다. 또는 Amazon Simple Notification Service(SNS) 주제로 세부 정보를 보내도록 짝수 소스 매핑을 구성합니다. 이렇게 하려면 실패 시 대상 파라미터를 사용합니다.

스로틀 발생

이벤트 레코드는 순차적으로 읽히기 때문에 현재 호출이 제한되는 경우 Lambda 함수는 다음 레코드로 진행할 수 없습니다.

DynamoDB 스트림을 사용하는 경우 동일한 스트림 샤드에 두 개 이상의 소비자를 구성하지 마세요. 샤드당 두 개 이상의 리더가 있는 경우 이로 인해 제한이 발생할 수 있습니다. 단일 스트림 샤드에 두 개 이상의 리더가 필요한 경우 팬아웃 패턴을 사용합니다. 스트림에서 레코드를 소비한 다음 다른 다운스트림 Lambda 함수 또는 Amazon Kinesis 스트림으로 전달하도록 Lambda 함수를 구성합니다.

Lambda 측에서는 제한이 발생하지 않도록 동시성 제한을 사용합니다.

Lambda 처리량(throughput)

런타임 기간

Lambda 함수의 Duration 지표가 높으면 함수의 처리량(throughput)이 감소하고 IteratorAge가 증가합니다.

함수의 런타임 기간을 줄이려면 다음 방법 중 하나 또는 둘 다를 사용합니다.

1.    함수에 할당된 메모리 양을 늘립니다.

2.    레코드를 처리하는 데 필요한 시간을 줄일 수 있도록 함수 코드를 최적화합니다.

Lambda 동시 실행

최대 동시 Lambda 실행 횟수는 다음과 같이 계산됩니다.

동시 실행 = 샤드 수 x 샤드당 동시 배치(병렬화 계수)

  • 샤드 수 - DynamoDB 스트림에서 테이블의 파티션 수와 스트림 샤드 수 사이에는 1<>1 매핑이 있습니다. 파티션 수는 테이블의 크기와 처리량(throughput)에 따라 결정됩니다. 테이블의 각 파티션은 최대 3,000개의 읽기 요청 단위나 1,000개의 쓰기 요청 단위 또는 이 둘의 선형 조합을 지원할 수 있습니다. 따라서 동시성을 높이려면 테이블의 프로비저닝된 용량을 늘려 샤드 수를 늘립니다.
  • 샤드당 동시 배치(병렬화 계수) - 이벤트 소스 매핑에서 샤드당 동시 배치 수를 구성할 수 있습니다. 기본값은 1이며 최대 10까지 늘릴 수 있습니다.

예를 들어 테이블에 10개의 파티션이 있고 샤드당 동시 배치가 5로 설정된 경우 최대 50개의 동시 실행을 수행할 수 있습니다.

참고: 지정된 시간에 올바른 순서로 항목 수준 수정을 처리하려면 파티션 키가 같은 항목이 동일한 배치로 이동합니다. 따라서 테이블 파티션 키의 카디널리티가 높고 트래픽이 핫 키를 생성하지 않는지 확인합니다. 예를 들어 샤드당 동시 배치 값을 10으로 설정하고 쓰기 트래픽이 단일 파티션 키 하나를 대상으로 하는 경우 샤드당 하나의 동시 실행만 수행할 수 있습니다.

배치 크기

배치 크기 값을 조정하면 Lambda 처리량(throughput)을 늘리는 데 도움이 됩니다. 배치당 적은 수의 레코드를 처리하면 스트림 처리 속도가 느려집니다.

배치당 레코드 수가 많으면 함수 실행 기간이 늘어날 수 있습니다. 따라서 여러 값으로 테스트하여 사용 사례에 가장 적합한 값을 찾습니다.

함수의 런타임 기간이 이벤트의 레코드 수와 독립적인 경우 함수의 배치 크기를 늘리면 함수의 반복기 수명이 줄어듭니다.