[AWS]SQS 기초(Lambda에서 SQS로 메세지 보내기)

박민하·2022년 8월 4일
0

AWS

목록 보기
6/11
post-thumbnail

Amazon Simple Queue Service(SQS)는 마이크로 서비스, 분산 시스템 및 서버리스 애플리케이션을 쉽게 분리하고 확장할 수 있도록 지원하는 완전관리형 메시지 대기열 서비스입니다.
출처: aws amazon

✅ SQS

  SQS는 메세지 데이터를 담을 수 있는 공간을 제공해준다. 만약 처리해야 할 데이터가 많다면, 서버에서 바로 처리하는 것보다 역할을 분산시켜서 작업을 하는게 서버의 부담도 적고 효율성도 높을것이다.

  예를 들어서 상품을 구매하고자 하는 소비자와, 주문 내역을 데이터베이스에 저장해야 하는 판매자가 있다. 판매하는 상품은 한정판이어서 수 많은 소비자가 동시간대에 주문을 할 예정이다. 대량의 데이터를 한 번에 넣으려고 하면 데이터를 처리하는데 시간도 오래 걸릴 뿐더러 데이터가 소실될 수도 있다. 이런 경우에 서버와 데이터베이스 사이에 SQS를 끼워서 중간 역할을 하도록 한다.

✅ Lambda에서 SQS로 메세지 보내기

  Lambda 함수가 실행될 때마다 접속자 정보가 100개씩 DB에 저장되게 하고싶다. 하지만 100개의 데이터를 하나하나 전송하기 보다는, 100개의 데이터를 묶어서 SQS로 보낸 후에 한번에 데이터를 저장하는 방식으로 진행하고 싶다.

1. Lambda 생성

  Lambda를 만들 때 권한 설정을 잘 해야한다. 이번에 SQS와 CloudWatch 서비스를 사용해야 하니 권한을 적당히 잘 추가해서 만들어준다.

2. SQS 메시지 대기열 생성

  Amazon SQS 페이지에서 대기열 생성 버튼을 누른다. 메세지 순서는 딱히 의미가 없었기에 대기열 유형을 표준으로 하고 바로 생성 버튼을 눌렀다. 만약 먼저 들어온 메세지를 먼저 처리해야한다면 FIFO를 선택한다.

3. lambda 트리거 설정

  SQS로 메세지를 보낼 lambda 페이지에서 트리거 추가를 한다. SQS를 선택하고 아까 만들었던 SQS 대기열 주소를 선택한다.

4. lambda 함수

  아래 코드는 DB가 polling 해갈 데이터를 SQS로 보내는 작업이다.


import json
import os
import boto3
import random
import socket

from datetime import datetime, timedelta, timezone
from botocore.exceptions import ClientError


def lambda_handler(event, context):
    dynamo = boto3.resource('dynamodb').Table('insert_test_db')
    KST    = timezone(timedelta(hours=+9), 'KST')
    ip     = socket.gethostbyname(socket.gethostname())
    
    lst = []
    for i in range(1,101):
        values = {
            'id': len(dynamo.scan(TableName='insert_test_db')["Items"]) + i, 
            "date_of_visit" : datetime.now(KST).strftime("%Y-%m-%d %H:%M:%S.%f"), 
            "ip_address" : ip, 
            "user_number" : random.randrange(1000000)}
        lst.append(values)
    
    msg_body = json.dumps(lst)
    msg = send_sqs_message(os.environ['SQS_QUEUE'], msg_body)
    
def send_sqs_message(sqs_queue_url, msg_body):
    sqs_client = boto3.client('sqs')

    msg = sqs_client.send_message(QueueUrl=sqs_queue_url, MessageBody=msg_body)

환경변수를 설정해야 os.environ[<key값>] 코드가 실행된다. 구성 > 환경변수 로 들어가 key/value 값을 입력한다. value는 SQS URL 주소를 넣으면 된다. URL 주소는 1번에서 SQS를 생성한 페이지 참고.

4. SQS 메세지 폴링

  SQS 대기열 페이지로 돌아가면 메세지가 들어왔는지 확인할 수 있다.

  확인하려는 SQS 페이지로 들어가 메세지 전송 및 수신 > 메세지 폴링 버튼을 누르면,

  메세지가 정상적으로 담긴 것을 볼 수 있다.


[참고 사이트]

생활코딩: Simple Queue Service (SQS)
SQS, Lambda를 이용해 문자전송하기(1부)

profile
backend developer 🐌

0개의 댓글