AWS Lambda를 Amazon DynamoDB와 함께 사용

AWS Lambda를 Amazon DynamoDB와 함께 사용

참고
Lambda 함수가 아닌 다른 대상으로 데이터를 보내거나 데이터를 보내기 전에 보강하고 싶다면 Amazon EventBridge Pipes를 참고하세요.

AWS Lambda 함수를 사용해 Amazon DynamoDB 스트림의 레코드를 처리할 수 있어요. DynamoDB Streams를 사용하면 DynamoDB 테이블이 업데이트될 때마다 Lambda 함수를 트리거해 추가 작업을 수행할 수 있죠.

DynamoDB 스트림을 처리할 때는 배치 내 일부 레코드가 실패할 때 이미 성공적으로 처리된 레코드가 재시도되지 않도록 부분 배치 응답(partial batch response) 로직을 구현해야 해요. Powertools for AWS Lambda의 배치 프로세서(Batch Processor) 유틸리티는 Python, TypeScript, .NET, Java에서 사용할 수 있으며, 부분 배치 응답 로직을 자동으로 처리해 개발 시간을 줄이고 안정성을 높여줘요.

출처: AWS Lambda 개발자 안내서

본문

Topics(주제)

스트림 폴링 및 배치

Lambda는 DynamoDB 스트림의 샤드를 초당 4회의 기본 속도로 폴링해 레코드를 찾아요. 레코드가 있으면 Lambda가 함수를 호출하고 결과를 기다립니다. 처리가 성공하면 Lambda는 더 많은 레코드를 받을 때까지 폴링을 재개해요.

기본적으로 Lambda는 레코드가 생기는 즉시 함수를 호출해요. Lambda가 이벤트 소스에서 읽은 배치에 레코드가 하나만 있으면 함수에 레코드 하나만 보내요. 적은 수의 레코드로 함수를 호출하지 않으려면 배칭 창(batching window) 을 구성해 이벤트 소스가 레코드를 최대 5분까지 버퍼링하게 할 수 있어요. 함수를 호출하기 전에 Lambda는 전체 배치를 모으거나, 배칭 창이 만료되거나, 배치가 6MB 페이로드 한도에 도달할 때까지 이벤트 소스에서 레코드를 계속 읽어요. 자세한 내용은 배칭 동작을 참고하세요.

경고
Lambda 이벤트 소스 매핑은 각 이벤트를 최소 한 번은 처리하며, 레코드의 중복 처리가 발생할 수 있어요. 중복 이벤트와 관련된 잠재적 문제를 피하려면 함수 코드를 멱등(idempotent)하게 만드는 것을 강력히 권장해요. 자세한 내용은 AWS Knowledge Center의 Lambda 함수를 멱등하게 만드는 방법을 참고하세요.

Lambda는 다음 배치를 처리하기 위해 보내기 전에 구성된 확장(extension)이 완료될 때까지 기다리지 않아요. 즉 Lambda가 다음 배치의 레코드를 처리하는 동안 확장이 계속 실행될 수 있어요. 이로 인해 계정의 동시성 설정이나 한도를 위반하면 스로틀링 문제가 발생할 수 있죠. 잠재적 문제인지 감지하려면 함수를 모니터링하고 이벤트 소스 매핑에 대해 예상보다 높은 동시성 지표가 보이는지 확인하세요. 호출 사이의 시간이 짧아서 Lambda가 샤드 수보다 높은 동시성 사용률을 잠깐 보고할 수 있어요. 이는 확장이 없는 Lambda 함수에서도 해당될 수 있습니다.

ParallelizationFactor 설정을 구성하면 DynamoDB 스트림의 샤드 하나를 둘 이상의 Lambda 호출로 동시에 처리할 수 있어요. 병렬화 요소를 1(기본값)부터 10까지 지정해 Lambda가 샤드에서 폴링하는 동시 배치 수를 정할 수 있죠. 예를 들어 ParallelizationFactor를 2로 설정하면 100개의 DynamoDB 스트림 샤드를 처리하기 위해 최대 200개의 동시 Lambda 호출을 가질 수 있어요(실제로는 ConcurrentExecutions 지표에서 다른 값을 볼 수도 있어요). 이는 데이터 양이 변동이 심하고 IteratorAge가 높을 때 처리 처리량을 확장하는 데 도움이 돼요. 샤드당 동시 배치 수를 늘려도 Lambda는 항목(파티션 및 정렬 키) 수준에서 순서대로 처리를 보장해요.

폴링 및 스트림 시작 위치

이벤트 소스 매핑 생성·업데이트 중의 스트림 폴링은 결과적으로 일관적(eventually consistent)이라는 점에 유의하세요.

  • 이벤트 소스 매핑 생성 중에는 스트림에서 이벤트 폴링을 시작하는 데 몇 분이 걸릴 수 있어요.
  • 이벤트 소스 매핑 업데이트 중에는 스트림에서 이벤트 폴링을 중지하고 다시 시작하는 데 몇 분이 걸릴 수 있어요.

이 동작 때문에 스트림의 시작 위치로 LATEST를 지정하면 이벤트 소스 매핑이 생성 또는 업데이트 중에 이벤트를 놓칠 수 있어요. 이벤트가 놓치지 않도록 스트림 시작 위치를 TRIM_HORIZON으로 지정하세요.

DynamoDB Streams에서 샤드의 동시 리더

글로벌 테이블이 아닌 단일 리전 테이블의 경우, 같은 DynamoDB Streams 샤드를 동시에 읽도록 Lambda 함수를 최대 2개까지 설계할 수 있어요. 이 한도를 초과하면 요청 스로틀링이 발생할 수 있어요. 글로벌 테이블의 경우 요청 스로틀링을 피하려면 동시 함수 수를 1개로 제한하는 것을 권장해요.

예제 이벤트

예제

{
  "Records": [
    {
      "eventID": "1",
      "eventVersion": "1.0",
      "dynamodb": {
        "Keys": {
          "Id": {
            "N": "101"
          }
        },
        "NewImage": {
          "Message": {
            "S": "New item!"
          },
          "Id": {
            "N": "101"
          }
        },
        "StreamViewType": "NEW_AND_OLD_IMAGES",
        "SequenceNumber": "111",
        "SizeBytes": 26
      },
      "awsRegion": "us-west-2",
      "eventName": "INSERT",
      "eventSourceARN": "arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525",
      "eventSource": "aws:dynamodb"
    },
    {
      "eventID": "2",
      "eventVersion": "1.0",
      "dynamodb": {
        "OldImage": {
          "Message": {
            "S": "New item!"
          },
          "Id": {
            "N": "101"
          }
        },
        "SequenceNumber": "222",
        "Keys": {
          "Id": {
            "N": "101"
          }
        },
        "SizeBytes": 59,
        "NewImage": {
          "Message": {
            "S": "This item has changed"
          },
          "Id": {
            "N": "101"
          }
        },
        "StreamViewType": "NEW_AND_OLD_IMAGES"
      },
      "awsRegion": "us-west-2",
      "eventName": "MODIFY",
      "eventSourceARN": "arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525",
      "eventSource": "aws:dynamodb"
    }
  ]}

더 알아보기 (Learn more)

  • DynamoDB 스트림 폴링·배칭·시작 위치, 병렬화, 동시 리더 제한과 이벤트 형식을 바탕으로 레코드 처리 주제를 이어서 살펴보세요.