Amazon Web Services 한국 블로그

Amazon Simple Queue Service (SQS), AWS Lambda 이벤트 소스 추가 지원

이제 Amazon Simple Queue Service (SQS)를 사용하여 AWS Lambda 함수를 트리거할 수 있습니다! 이 업데이트는 제가 개인적으로 4년 이상 기다려 온 일부 핵심 기능을 포함하는 멋진 업데이트입니다. 이미 알고 계신 부분의 복습 없이 바로 이 업데이트를 사용해 보려면 아래의 단계별 안내 섹션으로 건너뛰셔도 됩니다.

SQS는 14년 전인 2004년 AWS에서 최초로 출시한 서비스입니다. 2004년 당시 상황을 보자면 가장 큰 상용 하드 드라이브가 약 60GB였으며, PHP 5가 발표되었고, Facebook이 막 출시되었으며, TV 시트콤 프렌즈가 종영되었고, GMail이라는 새로운 서비스가 선보였으며, 저는 아직 고등학교를 다니고 있었습니다. 되돌아보면 SQS의 개발 초기 단계에서도 완전 관리형, 네트워크 액세스 가능, 종량요금제, 최소 약정 없는 구매 등 오늘날의 AWS를 만들어준 원칙을 볼 수 있었습니다. 오늘날, SQS는 수십만 고객이 초대형 규모의 환경에서 가장 많이 사용하는 네 가지 서비스 중 하나로서 수많은 애플리케이션의 기본 구성 요소 중 하나의 자리를 차지하고 있습니다.

이에 비해 AWS Lambda는 상대적으로 새롭게 선보이는 서비스로서 2014년 AWS re:Invent에서 첫선을 보였습니다(저도 그 날 이벤트 현장에 있었습니다!). Lambda는 서버 프로비저닝 또는 관리 없이 코드를 실행할 수 있게 해 주는 컴퓨팅 서비스로서 2014년 당시 서버리스 혁명을 주도했습니다. 이 서비스는 웹과 모바일 백엔드에서 IT 정책 엔진과 데이터 처리 파이프라인에 이르기까지 광범위한 사용 사례에 즉각적으로 도입되었습니다. 오늘날 Lambda는 Node.js, Java, Go, C# 및 Python 실행 시간을 지원하므로 고객은 기존 코드 기반에 대한 변경을 최소화하고 새로운 솔루션 제작 시 유연성을 확보할 수 있습니다. AWS에서는 고객이 쉽게 작업을 수행할 수 있도록 지난 4년 동안 Lambda를 위한 다양한 기능과 이벤트 소스를 추가했습니다. Lambda에 SQS 지원을 추가함으로써 AWS는 폴링 서비스의 실행이나 SQS-SNS 매핑 생성과 같은 획일적인 작업에 대한 부담을 제거했습니다.

이 기능의 작동 원리를 살펴보겠습니다.

SQS에서 Lambda 트리거

우선, 기존의 SQS 표준 대기열이 있거나 새로운 대기열을 생성해야 합니다. AWS Management Console에서 SQS를 열고 새로운 대기열을 생성하겠습니다. 재미있는 이름도 추가하겠습니다. 현재로는 Lambda에서 표준 대기열만 작동하며 FIFO 대기열은 지원되지 않습니다.

이제 대기열을 만들었으므로 이를 처리할 Lambda 함수를 생성하겠습니다. Lambda 콘솔에서 Python 코드로 다음과 같은 메시지 본문을 인쇄하는 간단한 함수를 새로 만들 수 있습니다.

def lambda_handler(event, context):
    for record in event['Records']:
        print(record['body'])

다음에는 Lambda 함수에 대한 트리거를 추가해야 합니다. 콘솔 왼쪽에서 SQS 트리거를 선택하겠습니다. Lambda를 호출하는 데 사용할 대기열과 단일 Lambda가 처리할 최대 레코드 수(SQS ReceiveMessage API 기준으로 최대 10개)를 선택할 수 있습니다.

Lambda는 대기열에 있는 각각의 새 메시지에 대해 Lamdba 함수를 호출하기 위해 자동으로 수평 확장됩니다. 예를 들어, 대기열에 100개의 메시지가 있으며 트리거가 활성화된 경우 Lambda는 메시지를 동시 처리하기 위해 100개의 함수 호출을 실행합니다. 대기열 트래픽의 변동에 따라 Lambda 서비스는 처리 중인 메시지의 수를 기반으로 폴링 작업을 확대 또는 축소합니다. 이 동작은 본 게시물 하단에 있는 추가 정보 섹션에서 상세히 다루고 있습니다. 배치 크기가 10으로 설정된 경우 10개의 새로운 Lambda 함수를 호출하게 됩니다. 이 동작을 제어하려면 해당 함수에 대한 동시 실행 제한을 증가 또는 감소시킬 수 있습니다.

처리된 각각의 메시지 배치에 대해 함수가 성공적으로 결과를 반환하면 해당 메시지가 대기열에서 제거됩니다. 함수에 오류가 발생하거나 시간이 초과되는 경우 대기열에 설정된 제한 시간 초과 기간 후에 메시지가 대기열로 반환됩니다. 참고로 SQS-Lambda 이벤트 매핑을 생성하려면 Lambda 함수 시간 초과 값은 대기열의 제한 시간 초과 값보다 낮아야 합니다.

트리거를 추가했으면 함수에 대한 다른 변경 사항을 적용한 후 저장합니다. SQS 콘솔로 돌아가면 트리거가 등록된 것을 볼 수 있습니다. SQS 콘솔에서도 트리거를 구성하고 편집할 수 있습니다.

AWS CLI를 사용하여 단일 메시지를 대기열에 추가하고 기능을 테스트하겠습니다.

aws sqs send-message --queue-url https://sqs.us-east-2.amazonaws.com/054060359478/SQS_TO_LAMBDA_IS_FINALLY_HERE_YAY --message-body "hello, world"

Lambda에서 메시지를 수신하고 코드를 실행하여 Amazon CloudWatch 로그에 메시지 페이로드를 인쇄합니다.

물론 이 모든 작업은 AWS SAM에서 별도의 구성 없이 바로 작동합니다.

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Example of processing messages on an SQS queue with Lambda
Resources:
  MySQSQueueFunction:
    Type: AWS::Serverless::Function
    Properties:
      Runtime: python3.6
      CodeUri: src/
      Events:
        MySQSEvent:
          Type: SQS
          Properties:
            Queue: !GetAtt MySqsQueue.Arn
            BatchSize: 10

  MySqsQueue:
    Type: AWS::SQS::Queue

추가 정보

우선, 이 기능에는 별도의 요금이 부과되지 않습니다. 그러나 Lambda 서비스는 연속적으로 SQS 대기열을 장기 폴링하므로 계정에는 이러한 API 호출에 대한 표준 SQS 요금이 부과됩니다.

이제 동시성 및 자동 조정을 심층적으로 탐색해 보겠습니다. 참고로 이 동작은 추후 변경될 수 있습니다. Lambda의 자동 조정 동작은 대기열이 비어 있을 때 폴링 요금을 저렴하게 유지하는 동시에 대기열이 집중 사용될 때 확장을 통해 처리량을 높이도록 설계되어 있습니다. SQS 이벤트 소스 매핑을 최초로 생성 및 활성화했거나 장기간 트래픽이 없었다가 메시지가 처음 표시되는 경우 Lambda 서비스에서는 5개의 병렬 장기 폴링 연결을 사용하여 SQS 대기열의 폴링을 시작합니다. Lambda 서비스는 처리 중인 메시지의 수를 모니터링하고 이 수가 증가 추세인 경우 폴링 주기를 분당 ReceiveMessage 메시지 요청 20회, 함수 동시성을 분당 호출 60회 증가시킵니다. 대기열이 계속 분주한 범위 내에서 이 확장은 함수 동시성 제한에 도달할 때까지 계속 진행됩니다. 처리 중인 메시지가 하락 추세인 경우 Lambda는 폴링 주기를 분당 ReceiveMessage 요청 10회, 함수 호출 동시성을 분당 호출 30회 감소합니다.

설명서에서 이 게시물보다 더 많은 내용이 포함된 최신 정보를 확인할 수 있으며 SQS 이벤트 페이로드 예제도 확인할 수 있습니다. 설명서에서 SQS에 대한 자세한 내용을 확인할 수도 있습니다.

평소대로 이 기능에 대한 의견을 Twitter 또는 아래 의견란을 통해 보내주시기 바랍니다.

Randall