Lambda 이벤트 소스 매핑 - AWS Lambda

Lambda 이벤트 소스 매핑

이벤트 소스 매핑은 이벤트 소스에서 읽어 Lambda 함수를 호출하는 Lambda 리소스입니다. 이벤트 소스 매핑을 사용해 Lambda 함수를 직접 호출하지 않는 서비스의 스트림 또는 대기열에서 항목을 처리할 수 있습니다. Lambda는 다음 서비스에 이벤트 소스 매핑을 제공합니다.

이벤트 소스 매핑은 함수의 실행 역할에 있는 권한을 사용해 이벤트 소스의 항목을 읽고 관리합니다. 권한, 이벤트 구조, 설정 및 폴링 동작은 이벤트 소스에 따라 달라집니다. 자세한 내용은 이벤트 소스로 사용하는 서비스에 대해 링크된 주제를 참조하세요.

AWS Command Line Interface(AWS CLI) 또는 AWS SDK를 사용하여 이벤트 소스를 관리하려면 다음 API 작업을 사용할 수 있습니다.

다음 예제는 AWS CLI를 사용하여 배치 크기가 500인 Amazon 리소스 이름(ARN)이 지정하는 DynamoDB 스트림에 my-function이라는 함수를 매핑합니다.

aws lambda create-event-source-mapping --function-name my-function --batch-size 500 --maximum-batching-window-in-seconds 5 --starting-position LATEST \ --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2019-06-10T19:26:16.525

다음 결과가 표시됩니다.

{ "UUID": "14e0db71-5d35-4eb5-b481-8945cf9d10c2", "BatchSize": 500, "MaximumBatchingWindowInSeconds": 5, "ParallelizationFactor": 1, "EventSourceArn": "arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2019-06-10T19:26:16.525", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "LastModified": 1560209851.963, "LastProcessingResult": "No records processed", "State": "Creating", "StateTransitionReason": "User action", "DestinationConfig": {}, "MaximumRecordAgeInSeconds": 604800, "BisectBatchOnFunctionError": false, "MaximumRetryAttempts": 10000 }

Lambda 이벤트 소스 매핑은 폴러의 분산 특성으로 인해 이벤트를 한 번 이상 처리합니다. 결과적으로 Lambda 함수는 드물게 중복 이벤트를 수신할 수 있습니다. AWS Lambda 함수 작업의 모범 사례을(를) 따르고 멱등성 함수를 빌드하면 후속 중복 이벤트와 관련된 문제를 방지할 수 있습니다.

일괄 처리 동작

이벤트 소스 매핑은 대상 이벤트 소스에서 항목을 읽습니다. 기본적으로 이벤트 소스 매핑은 레코드를 일괄 처리하고 Lambda는 이를 단일 페이로드로 함수에 전송합니다. 일괄 처리 동작을 미세 조정하려면 일괄 처리 기간(MaximumBatchingWindowInSeconds) 및 배치 크기(BatchSize)를 구성할 수 있습니다. 일괄 처리 기간은 레코드를 단일 페이로드로 수집할 최대 기간입니다. 배치 크기는 단일 배치의 최대 레코드 수입니다. Lambda는 다음 세 가지 기준 중 하나에 부합할 때 함수를 호출합니다.

  • 일괄 처리 기간이 최댓값에 도달합니다. 일괄 처리 기간 동작은 특정 이벤트 소스에 따라 다릅니다.

    • Kinesis, DynamoDB 및 Amazon SQS 이벤트 소스의 경우: 기본 일괄 처리 기간은 0초입니다. 즉, Lambda는 가능한 한 빨리 함수로 배치를 전송합니다. MaximumBatchingWindowInSeconds를 구성하는 경우, 이전 함수 호출이 완료되는 즉시 다음 일괄 처리 기간이 시작됩니다.

    • Amazon MSK, 자체 관리형 Apache Kafka 및 Amazon MQ 이벤트 소스의 경우: 기본 일괄 처리 기간은 500ms입니다. MaximumBatchingWindowInSeconds는 0초에서 300초 사이의 값을 초 단위로 구성할 수 있습니다. 일괄 처리 기간은 첫 번째 레코드가 도착하는 즉시 시작됩니다.

      참고

      MaximumBatchingWindowInSeconds는 초 단위로만 변경할 수 있기 때문에 변경한 후에는 500ms 기본 일괄 처리 기간으로 되돌릴 수 없습니다. 기본 일괄 처리 기간을 복원하려면 새 이벤트 소스 매핑을 생성해야 합니다.

  • 배치 크기가 충족됩니다. 최소 배치 크기는 1입니다. 기본 및 최대 배치 크기는 이벤트 소스에 따라 다릅니다. 이러한 값에 대한 자세한 내용은 CreateEventSourceMapping API 작업에 대한 BatchSize 사양을 참조하세요.

  • 페이로드 크기가 6MB에 도달합니다. 이 한도는 수정할 수 없습니다.

다음 다이어그램은 이 세 가지 조건을 보여줍니다. 일괄 처리 기간이 t = 7초에서 시작한다고 가정합니다. 첫 번째 시나리오에서는 5개의 레코드를 누적한 후 일괄 처리 기간이 t = 47초로 2차 최댓값인 40에 도달합니다. 두 번째 시나리오에서는 일괄 처리 기간이 만료되기 전에 배치 크기가 10에 도달하므로 일괄 처리 기간이 일찍 종료됩니다. 세 번째 시나리오에서는 일괄 처리 기간이 만료되기 전에 최대 페이로드 크기에 도달하므로 일괄 처리 기간이 일찍 종료됩니다.


        배치 기간은 일괄 처리 기간이 최댓값에 도달하거나 배치 크기가 충족되거나 페이로드 크기가 6MB에 도달하는 세 가지 기준 중 하나가 충족되면 만료됩니다.

다음 예제에서는 Kinesis 스트림에서 읽는 이벤트 소스 매핑을 보여줍니다. 이벤트 배치가 모든 처리 시도에 실패하면 이벤트 소스 매핑은 배치에 관한 세부 정보를 SQS 대기열로 보냅니다.


        이벤트 소스 매핑은 Kinesis 스트림에서 읽기를 수행합니다. 레코드를 함수로 보내기 전에 로컬로 대기열에 저장합니다.

이벤트 배치는 Lambda가 함수에 보내는 이벤트입니다. 이것은 현재 일괄 처리 기간이 만료될 때까지 이벤트 소스 매핑이 읽는 항목에서 컴파일된 레코드 또는 메시지의 배치입니다.

스트림의 경우 이벤트 소스 매핑은 스트림에 있는 각 샤드에 대해 반복기를 생성하고 각 샤드에 있는 항목을 순서대로 처리합니다. 이벤트 소스 매핑이 스트림에 표시되는 새 항목만 읽도록 또는 더 오래된 항목으로 시작하도록 구성할 수 있습니다. 처리된 항목은 스트림에서 제거되지 않으며 다른 함수 또는 소비자가 처리할 수 있습니다.

기본적으로, 함수가 오류를 반환하는 경우 함수가 성공할 때까지 또는 배치에 있는 항목이 만료될 때까지 전체 배치가 다시 처리됩니다. 순차적 처리를 위해 이벤트 소스 매핑은 오류가 해결될 때까지 영향을 받은 샤드에 대한 처리를 일시 중지합니다. 이전 이벤트를 무시하거나, 재시도 횟수를 제한하거나, 여러 배치를 병렬로 처리하도록 이벤트 소스 매핑을 구성할 수 있습니다. 여러 배치를 병렬로 처리하는 경우에도 각 파티션 키에 대해 순차적 처리가 보장되지만 이벤트 소스 매핑은 동일한 샤드의 여러 파티션 키를 동시에 처리합니다.

이벤트 배치를 무시할 때 호출 레코드를 다른 서비스로 보내도록 이벤트 소스 매핑을 구성할 수도 있습니다. Lambda는 이벤트 소스 매핑에 대해 다음 대상을 지원합니다.

  • Amazon SQS - SQS 대기열입니다.

  • Amazon SNS - SNS 주제입니다.

호출 레코드에는 JSON 형식의 실패한 이벤트 배치에 관한 세부 정보가 포함되어 있습니다.

다음 예제에서는 Kinesis 스트림의 호출 레코드를 보여 줍니다.

예 호출 레코드

{ "requestContext": { "requestId": "c9b8fa9f-5a7f-xmpl-af9c-0c604cde93a5", "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction", "condition": "RetryAttemptsExhausted", "approximateInvokeCount": 1 }, "responseContext": { "statusCode": 200, "executedVersion": "$LATEST", "functionError": "Unhandled" }, "version": "1.0", "timestamp": "2019-11-14T00:38:06.021Z", "KinesisBatchInfo": { "shardId": "shardId-000000000001", "startSequenceNumber": "49601189658422359378836298521827638475320189012309704722", "endSequenceNumber": "49601189658422359378836298522902373528957594348623495186", "approximateArrivalOfFirstRecord": "2019-11-14T00:38:04.835Z", "approximateArrivalOfLastRecord": "2019-11-14T00:38:05.580Z", "batchSize": 500, "streamArn": "arn:aws:kinesis:us-east-2:123456789012:stream/mystream" } }

Lambda는 또한 FIFO(선입선출) 대기열에 대한 순차적 처리를 지원하므로 활성 메시지 그룹의 수까지 확장할 수 있습니다. 표준 대기열의 경우 항목이 반드시 순서대로 처리되지는 않습니다. Lambda는 최대한 빠르게 표준 대기열을 처리할 수 있도록 확장됩니다. 오류가 발생하면 Lambda는 배치를 개별 항목으로 대기열에 반환하고 원래 배치와 다른 그룹으로 처리할 수 있습니다. 때때로 이벤트 소스 매핑은 함수 오류가 발생하지 않았다 하더라도 대기열에서 동일한 항목을 두 번 수신할 수 있습니다. Lambda는 성공적으로 처리된 항목을 대기열에서 삭제합니다. Lambda에서 항목을 처리할 수 없는 경우 항목을 배달 못한 편지 대기열로 보내도록 소스 대기열을 구성할 수 있습니다.

Lambda 함수를 직접 호출하는 서비스에 대한 자세한 내용은 다른 서비스와 함께 AWS Lambda 사용를 참조하세요.