Using AWS Lambda with Amazon SQS - AWS Lambda

Using AWS Lambda with Amazon SQS

AWS Lambda 함수를 사용하여 Amazon Simple Queue Service(Amazon SQS) 대기열의 메시지를 처리할 수 있습니다. Lambda 이벤트 소스 매핑표준 대기열FIFO(선입선출) 대기열을 지원합니다. Amazon SQS를 사용하면 작업을 대기열로 전송하고 비동기식으로 처리하여 애플리케이션의 구성 요소 중 하나에서 작업을 오프로드할 수 있습니다.

Lambda에서는 대기열을 폴링하고 대기열 메시지가 포함된 이벤트와 동기적으로 함수를 호출합니다. Lambda는 메시지를 배치로 읽고 각 배치에 대해 한 번씩 함수를 호출합니다. 함수가 배치를 성공적으로 처리하면 Lambda는 대기열에서 메시지를 삭제합니다. 다음 예제에서는 메시지 두 개의 배치에 대한 이벤트를 보여 줍니다.

예 Amazon SQS 메시지 이벤트(표준 대기열)

{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "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" } ] }

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" } ] }

Lambda이 배치를 읽으면 메시지는 대기열에 머무르지만 대기열의 가시성 제한 시간 동안 숨은 상태가 됩니다. 함수가 배치를 성공적으로 처리하면 Lambda는 대기열에서 메시지를 삭제합니다. 함수가 제한되거나 오류를 반환하거나 응답하지 않는 경우 메시지는 다시 표시됩니다. 실패한 배치의 모든 메시지는 대기열로 반환되므로 함수 코드가 부작용 없이 동일한 메시지를 여러 번 처리할 수 있어야 합니다.

조정 및 처리

표준 대개열의 경우 Lambda은 긴 폴링을 사용하여 대개열이 활성화될 때까지 대기열을 폴링합니다. 메시지를 사용할 수 있는 경우 Lambda는 최대 5개의 배치를 읽고 이 배치를 함수로 보냅니다. 메시지를 계속 사용할 수 있는 경우 Lambda는 배치를 읽는 프로세스의 수를 분당 최대 60개의 추가 인스턴스까지 증가시킵니다. 이벤트 소스 매핑으로 동시에 처리할 수 있는 최대 배치 수는 1000개입니다.

FIFO 대기열의 경우, Lambda이 메시지를 수신하는 순서대로 함수에 메시지를 보냅니다. FIFO 대기열로 메시지를 보낼 때 메시지 그룹 ID를 지정합니다. Amazon SQS는 동일한 그룹의 메시지가 Lambda 순서대로 배달되게 합니다. Lambda는 메시지를 그룹으로 정렬하고 그룹에 대해 한 번에 하나의 배치만 보냅니다. 함수가 오류를 반환하면 Lambda이 동일한 그룹에서 추가 메시지를 받기 전에 영향을 받는 메시지에 대해 모든 재시도가 시도됩니다.

함수는 활성 메시지 그룹의 수에 동시성을 조정할 수 있습니다. 자세한 내용은 AWS 컴퓨팅 블로그의 이벤트 소스로 SQS FIFO를 참조하십시오.

Lambda에서 사용할 수 있도록 대기열 구성

Lambda 함수의 이벤트 소스로 제공할 SQS 대기열을 만듭니다. 그런 다음 Lambda 함수가 각 이벤트 배치를 처리하고 Lambda가 확장 시 병목 현상 오류에 응답해 다시 시도할 수 있는 시간을 허용하도록 대기열을 구성합니다.

각 레코드 배치를 처리할 함수 시간을 허용하려면 소스 대기열의 제한 시간 초과를 함수에 대해 구성한 제한 시간의 6배 이상으로 설정합니다. 추가 시간은 함수가 이전 배치를 처리하는 중 함수 실행에서 병목 현상이 발생한 경우 Lambda가 재시도하도록 허용합니다.

메시지 처리에 여러 번 실패하면 Amazon SQS에서는 해당 메시지를 배달 못한 편지 대기열로 보냅니다. 함수가 오류를 반환하면 Lambda는 해당 오류를 대기열에 남깁니다. 제한 시간 초과가 발생하면 Lambda는 메시지를 다시 수신합니다. 여러 번 수신한 후 메시지를 두 번째 대기열로 보내려면 소스 대기열에 배달 못한 편지 대기열을 구성합니다.

참고

Lambda 함수가 아닌 소스 대기열에서 배달 못한 편지 대기열을 구성해야 합니다. 함수에서 구성하는 배달 못한 편지 대기열은 이벤트 소스 대기열이 아닌 함수의 비동기식 호출 대기열에 사용됩니다.

함수가 오류를 반환하거나 최대 동시성 상태이기 때문에 호출할 수 없는 경우에는 추가 시도로 처리에 성공할 수 있습니다. 메시지를 배달 못한 편지 대기열로 보내기 전에 메시지를 더 잘 처리할 수 있도록 하려면 원본 대기열의 리드라이브 정책에서 maxReceiveCount5이상으로 설정합니다.

실행 역할 권한

Amazon SQS 대기열의 메시지를 관리하려면 Lambda에 다음 권한이 필요합니다. 이러한 권한을 함수의 실행 역할에 추가합니다.

자세한 내용은 AWS Lambda 실행 역할 단원을 참조하십시오.

대기열을 이벤트 소스로 구성

이벤트 소스 매핑을 생성하여 Lambda가 대기열의 항목을 Lambda 함수로 전송하게 할 수 있습니다. 여러 이벤트 소스 매핑을 생성하여 하나의 함수로 여러 대기열의 항목을 처리할 수 있습니다. Lambda이 대상 함수를 호출하면 이벤트에는 구성 가능한 최대 배치 크기까지 항목이 여러 개 포함될 수 있습니다.

함수가 Lambda 콘솔의 Amazon SQS에서 읽도록 구성하려면 SQS 트리거를 생성합니다.

트리거를 생성하려면

  1. Lambda 콘솔 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. Designer에서 트리거 추가를 선택합니다.

  4. 트리거 유형을 선택합니다.

  5. 필요한 옵션을 구성하고 추가를 선택합니다.

Lambda은 Amazon SQS 이벤트 소스에 대해 다음과 같은 옵션을 지원합니다.

이벤트 소스 옵션

  • SQS 대기열 – 레코드를 읽어 올 Amazon SQS 대기열입니다.

  • 배치 크기 – 각 배치의 대기열에서 읽어 올 항목의 수입니다(최대 10개). Lambda가 대기열에서 읽어 오는 배치에 항목이 적을 경우 이벤트에 항목이 적게 들어 있을 수 있습니다.

  • 활성화 – 이벤트 소스 매핑을 활성화하려면 true로 설정합니다. 레코드 처리를 중지하려면 false로 설정합니다.

참고

Amazon SQS에는 요청에 대한 영구 프리 티어가 있습니다. 프리 티어 이후 Amazon SQS는 백만 건의 요청당 요금을 부과합니다. 이벤트 소스 매핑이 활성 상태인 경우 Lambda은 대기열에 항목을 가져오도록 요청합니다. 요금에 대한 자세한 내용은 Amazon Simple Queue Service 요금을 참조하십시오.

나중에 이벤트 소스 구성을 관리하기 위해 디자이너에서 트리거를 선택합니다.

함수 제한 시간은 항목의 전체 배치를 처리할 시간이 충분하도록 구성합니다. 항목을 처리하는 데 걸리는 시간이 길면 더 작은 배치 크기를 선택합니다. 배치 크기가 크면 매우 빠르거나 오버헤드가 큰 워크로드에 대한 효율성에 영향을 미칠 수 있습니다. 하지만 함수에서 오류를 반환하면 배치 내 모든 항목이 대기열로 반환됩니다. 함수에 예약된 동시성을 구성할 경우, 최소 동시성 실행 수를 5로 설정하여 Lambda가 함수를 호출할 때 발생할 수 있는 조절 오류를 최소화하십시오.

이벤트 소스 매핑 API

AWS CLI 또는 AWS SDK로 이벤트 소스 매핑을 관리하려면 다음 API 작업을 사용합니다.

다음 예제는 AWS CLI를 사용하여 Amazon 리소스 이름(ARN)으로 지정된 Amazon SQS 대기열에 my-function이라는 함수를 매핑합니다. 배치 크기는 5개입니다.

$ aws lambda create-event-source-mapping --function-name my-function --batch-size 5 \ --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue { "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284", "BatchSize": 5, "EventSourceArn": "arn:aws:sqs:us-east-2:123456789012:my-queue", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "LastModified": 1541139209.351, "State": "Creating", "StateTransitionReason": "USER_INITIATED" }