Amazon SQS에서 Lambda 사용
참고
Lambda 함수 이외의 대상으로 데이터를 전송하거나 데이터를 전송하기 전에 데이터를 보강하려는 경우 Amazon EventBridge 파이프를 참조하세요.
Lambda 함수를 사용하여 Amazon Simple Queue Service(Amazon SQS) 대기열의 메시지를 처리할 수 있습니다. Lambda는 이벤트 소스 매핑을 위해 표준 대기열과 선입선출(FIFO) 대기열을 모두 지원합니다. 프로비저닝 모드를 사용하여 Amazon SQS 이벤트 소스 매핑에 전용 폴링 리소스를 할당할 수도 있습니다. Lambda 함수와 Amazon SQS 대기열은 서로 다른 AWS 계정에 있을 수 있지만 동일한 AWS 리전에 있어야 합니다.
Amazon SQS 메시지를 처리할 때, 배치의 일부 메시지가 실패하는 경우 처리 완료된 메시지가 재시도되지 않도록 부분 배치 응답 로직을 구현해야 합니다. Powertools for AWS Lambda의 배치 프로세서 유틸리티
주제
Amazon SQS 이벤트 소스 매핑에 대한 폴링 및 배치 동작 이해
Amazon SQS 이벤트 소스 매핑을 사용하면 Lambda가 대기열을 폴링하고 이벤트와 동기적으로 함수를 간접적으로 간접 호출합니다. 각 이벤트에는 대기열의 여러 메시지 배치가 포함될 수 있습니다. Lambda는 이러한 이벤트를 한 번에 한 배치씩 수신하고 각 배치에 대해 함수를 한 번씩 간접적으로 간접 호출합니다. 함수가 배치를 성공적으로 처리하면 Lambda는 대기열에서 메시지를 삭제합니다.
Lambda가 배치를 수신하면 메시지는 대기열에 머무르지만 대기열의 표시 제한 시간 동안 숨겨집니다. 함수가 배치의 모든 메시지를 성공적으로 처리하면 Lambda는 대기열에서 메시지를 삭제합니다. 기본적으로 배치를 처리하는 동안 함수에 오류가 발생하면 표시 제한 시간이 만료된 후 해당 배치의 모든 메시지가 대기열에 다시 표시됩니다. 이러한 이유로 함수 코드는 의도하지 않은 부작용 없이 동일한 메시지를 여러 번 처리할 수 있어야 합니다.
주의
Lambda 이벤트 소스 매핑은 각 이벤트를 한 번 이상 처리하므로 레코드가 중복될 수 있습니다. 중복 이벤트와 관련된 잠재적 문제를 방지하려면 함수 코드를 멱등성으로 만드는 것이 좋습니다. 자세한 내용은 AWS 지식 센터의 함수를 멱등성 Lambda 함수로 만들려면 어떻게 해야 하나요?
Lambda가 메시지를 여러 번 처리하지 못하도록 하려면 함수 응답에 배치 항목 실패를 포함하도록 이벤트 소스 매핑을 구성하거나, Lambda 함수가 메시지를 성공적으로 처리할 경우 DeleteMessage API를 사용하여 대기열에서 메시지를 제거할 수 있습니다.
SQS 이벤트 소스 매핑을 위해 Lambda가 지원하는 구성 파라미터에 대한 자세한 내용은 SQS 이벤트 소스 매핑 생성 섹션을 참조하세요.
Amazon SQS 이벤트 소스 매핑에서 프로비저닝 모드 사용
이벤트 소스 매핑의 처리량을 미세 조정해야 하는 워크로드의 경우 프로비저닝된 모드를 사용할 수 있습니다. 프로비저닝된 모드에서는 프로비저닝된 이벤트 폴러의 양에 대한 최소 및 최대 제한을 정의합니다. 이러한 프로비저닝된 이벤트 폴러는 이벤트 소스 매핑 전용이며 응답형 오토스케일링을 통해 예상치 못한 메시지 급증을 처리할 수 있습니다. 프로비저닝 모드로 구성된 Amazon SQS 이벤트 소스 매핑은 기본 Amazon SQS 이벤트 소스 매핑 기능보다 3배 더 빠르게 확장되고(분당 최대 1,000개의 동시 간접 호출) 16배 더 높은 동시성(최대 20,000개의 동시 간접 호출)을 지원합니다. 시장 데이터 피드를 처리하는 금융 서비스 회사, 실시간 맞춤형 추천을 제공하는 전자 상거래 플랫폼, 라이브 플레이어 상호 작용을 관리하는 게임 회사 등 성능 요구 사항이 엄격한 Amazon SQS 이벤트 기반 워크로드에는 프로비저닝 모드를 사용하는 것이 좋습니다. 프로비저닝된 모드를 사용하면 추가 비용이 발생합니다. 요금에 대한 자세한 내용은 AWS Lambda 요금
프로비저닝 모드에서 각 이벤트 폴러는 최대 1MB/s의 처리량, 최대 10개의 동시 간접 호출 또는 초당 최대 10개의 Amazon SQS 폴링 API 직접 호출을 처리할 수 있습니다. 최소 이벤트 폴러 수(MinimumPollers)에 대해 허용되는 값의 범위는 2~200으로, 기본값은 2입니다. 최대 이벤트 폴러 수(MaximumPollers)에 대해 허용되는 값의 범위는 2~2,000으로, 기본값은 200입니다. MaximumPollers는 MinimumPollers보다 크거나 같아야 합니다.
필요한 이벤트 폴러 결정
SQS ESM에 프로비저닝 모드를 사용할 때 최적의 메시지 처리 성능 보장에 필요한 이벤트 폴러 수를 추정하려면 애플리케이션에 대해 지연 시간이 짧은 처리가 필요한 초당 최대 SQS 이벤트 수, 평균 SQS 이벤트 페이로드 크기, 평균 Lambda 함수 기간, 구성된 배치 크기 등의 지표를 수집합니다.
먼저 다음 공식을 사용하여 이벤트 폴러가 워크로드에 지원하는 초당 SQS 이벤트 수(EPS)를 추정할 수 있습니다.
EPS per event poller = minimum( ceiling(1024 / average event size in KB), ceiling(10 / average function duration in seconds) * batch size, min(100, 10 * batch size) )
이후 아래 공식을 사용하여 필요한 최소 폴러 수를 계산할 수 있습니다. 이 계산을 통해 최대 트래픽 요구 사항을 처리할 수 있는 충분한 용량을 프로비저닝할 수 있습니다.
Required event pollers = (Peak number of events per second in Queue) / EPS per event poller
기본 배치 크기가 10이고, 평균 이벤트 크기가 3KB이고, 평균 함수 기간이 100ms이고, 초당 1,000개의 이벤트를 처리해야 하는 워크로드를 고려합니다. 이 시나리오에서 각 이벤트 폴러는 약 100개의 초당 이벤트(EPS)를 지원합니다. 따라서 최대 트래픽 요구 사항을 적절하게 처리하려면 최소 폴러 수를 10으로 설정해야 합니다. 워크로드의 특성이 동일하지만 평균 함수 기간이 1초인 경우 각 폴러는 10 EPS만 지원하므로 짧은 지연 시간으로 초당 1,000개의 이벤트를 지원하도록 최소 100개의 폴러를 구성해야 합니다.
프로비저닝 모드 이벤트 폴러의 효율성을 극대화하려면 기본 배치 크기인 10 이상을 사용하는 것이 좋습니다. 배치 크기가 클수록 각 폴러가 간접 호출당 더 많은 이벤트를 처리하고, 이를 통해 처리량과 비용 효율성을 개선할 수 있습니다. 이벤트 폴러 용량을 계획할 때 잠재적 트래픽 급증을 고려하고 minimumPollers 값을 계산된 최소 값보다 약간 높게 설정하여 여유분을 두는 것이 좋습니다. 추가로 메시지 크기, 함수 기간 또는 트래픽 패턴의 변경으로 인해 최적의 성능과 비용 효율성을 유지하기 위해 이벤트 폴러 구성을 조정해야 할 수 있으므로 시간 경과에 따른 워크로드 특성을 모니터링합니다. 정확한 용량 계획을 위해 특정 워크로드를 테스트하여 각 이벤트 폴러가 처리할 수 있는 실제 EPS를 결정하는 것이 좋습니다.
Amazon SQS 이벤트 소스 매핑에 대한 프로비저닝 모드 구성
콘솔 또는 Lambda API를 사용하여 Amazon SQS 이벤트 소스 매핑에 대한 프로비저닝 모드를 구성할 수 있습니다.
기존 Amazon SQS 이벤트 소스 매핑에 대한 프로비저닝 모드를 구성하는 방법(콘솔)
-
Lambda 콘솔의 함수 페이지
를 엽니다. -
프로비저닝 모드를 구성하려는 Amazon SQS 이벤트 소스 매핑을 사용하여 함수를 선택합니다.
-
구성을 선택한 다음 트리거를 선택합니다.
-
프로비저닝 모드를 구성하려는 Amazon SQS 이벤트 소스 매핑을 선택하고 편집을 선택합니다.
-
이벤트 소스 매핑 구성에서 프로비저닝된 모드 구성을 선택하세요.
-
최소 이벤트 폴러에 2~200의 값을 입력하세요. 값을 지정하지 않는 경우 Lambda에서는 기본값(2)을 선택합니다.
-
최대 이벤트 폴러에 2~2,000의 값을 입력하세요 이 값은 최소 이벤트 폴러의 값 이상이어야 합니다. 값을 지정하지 않는 경우 Lambda에서는 기본값(200)을 선택합니다.
-
-
저장을 선택합니다.
EventSourceMappingConfiguration의 ProvisionedPollerConfig 객체를 사용하여 프로그래밍 방식으로 프로비저닝 모드를 구성할 수 있습니다. 예를 들어 다음 UpdateEventSourceMapping CLI 명령은 MinimumPollers 값을 5로, MaximumPollers 값을 100으로 구성합니다.
aws lambda update-event-source-mapping \ --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \ --provisioned-poller-config '{"MinimumPollers": 5, "MaximumPollers": 100}'
프로비저닝된 모드를 구성한 후 ProvisionedPollers 지표를 모니터링하여 워크로드에 대한 이벤트 폴러 사용량을 관찰할 수 있습니다. 자세한 내용은 이벤트 소스 매핑 지표를 참조하세요.
프로비저닝 모드를 비활성화하고 기본(온디맨드) 모드로 돌아가기 위해 다음 UpdateEventSourceMapping CLI 명령을 사용할 수 있습니다.
aws lambda update-event-source-mapping \ --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \ --provisioned-poller-config '{}'
참고
프로비저닝 모드는 최대 동시성 설정과 함께 사용할 수 없습니다. 프로비저닝 모드를 사용하는 경우 최대 이벤트 폴러 수를 통해 최대 동시성을 제어합니다.
프로비저닝 모드 구성에 대한 자세한 정보는 Amazon SQS 이벤트 소스 매핑 생성 및 구성 항목을 참조하세요.
표준 대기열 메시지 이벤트의 예
예 Amazon SQS 메시지 이벤트(표준 대기열)
{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": { "myAttribute": { "stringValue": "myValue", "stringListValues": [], "binaryListValues": [], "dataType": "String" } }, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" }, { "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082650636", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082650649" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" } ] }
기본적으로 Lambda는 대기열에서 최대 10개의 메시지를 한 번에 폴링하고 해당 배치를 함수로 보냅니다. 소수의 레코드로 함수를 간접적으로 호출하는 것을 피하려면 배치 기간을 구성하여 이벤트 소스가 최대 5분 동안 레코드를 버퍼링하도록 구성할 수 있습니다. 함수를 간접적으로 호출하기 전에 Lambda는 배치 기간이 만료되거나, 간접 호출 페이로드 크기 할당량에 도달하거나, 구성된 최대 배치 크기에 도달할 때까지 표준 대기열에서 메시지를 계속 폴링합니다.
배치 기간을 사용하고 SQS 대기열에 트래픽이 매우 적은 경우, Lambda는 함수를 호출하기 전에 최대 20초까지 기다릴 수 있습니다. 이는 배치 기간을 20초 미만으로 설정한 경우에도 마찬가지입니다.
참고
Java에서는 JSON을 역직렬화할 때 null 포인터 오류가 발생할 수 있습니다. 이는 JSON 객체 매퍼가 ‘Records’ 및 “eventSourceARN’의 대소문자를 변환하는 방식 때문일 수 있습니다.
FIFO 대기열 메시지 이벤트의 예
FIFO 대기열의 경우 레코드에는 중복 제거 및 시퀀싱과 관련된 추가 속성이 포함되어 있습니다.
예 Amazon SQS 메시지 이벤트(FIFO 대기열)
{ "Records": [ { "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5", "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1573251510774","SequenceNumber": "18849496460467696128", "MessageGroupId": "1","SenderId": "AIDAIO23YVJENQZJOL4VO","MessageDeduplicationId": "1","ApproximateFirstReceiveTimestamp": "1573251510774" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo", "awsRegion": "us-east-2" } ] }