AWS의 메시징 서비스

최동혁·2023년 3월 21일
0

클라우드

목록 보기
17/18
  • 지금까지 이전 게시글에서는 kafka를 이용해 온프레미스에서 동작하는 것으로 실습을 해보았다.
  • 이번에는 AWS에서 제공해주는 메시징 서비스를 이용해 실습을 해보도록 하자.

AWS 메시징 서비스

그리고 대기열 생성하면, topic 하나를 생성한 것이다.
메세지 주고 받는 걸 오른 쪽 위에 메시지 전송 및 수신에서 테스트 해볼 수 있다.
받는 걸 테스틀하려면 메시지 풀링을 눌러보면 된다.
그런데 우리가 해야하는건 여기서 확인하는게 아닌, 다양한 어플리케이션에서 이 메세지를 주고 받을 수 있냐이다.
큐 url을 파이썬 코드에 넣어준다.
파이썬에서 메시지를 url로 보낸 후, aws에서 메시지 풀링을 눌러보면 잘 담겨있는 것을 확인할 수 있다.
확인하면 오류 페이지 처럼 보이는 페이지가 나오는데, 오류가 아님
메세지 아이디가 오고, 그 밑에 오면서 위변조가 일어나지 않았음을 증명해주는 해시값이 같이 오게 됨.
SQS는 Lambda 트리거를 제공해줌.
우리는 Lambda 함수를 API GATEWAY로 실행시켜줬는데, SQS로도 할 수 있음.
메세지를 받았을 때 특정 함수를 구동시키게끔 해주는 역할 가능.
SNS는 SQS에서 메시지가 왔을 때, 알람 기능처럼 SNS로 메일을 보내줌.

  • aws에서 말하는 대기열은 kafka의 topic을 생성하는 거라고 생각

  • 표준 유형과 fifo 유형이 있는데, 표준은 순서가 보장 안되는거, fifo는 순서가 보장되는거임.
  • 표준은 최소 1회 전송이기 때문에 똑같은 메세지가 두 번 갈 수도 있다.
  • 이름은 큐 이름 아무거나 하면 된다.
  • 보통 메세지를 주고 받을 때 암호화를 시켜야하는데, 우리는 그냥 비활성화로 진행

  • 정책 같은 경우는 s3 할 때 정책 편집기 세팅 했었는데 그거랑 같은 개념
  • 큐를 이용할 수 있는 사람들을 정해주는 거임.
  • 보통 default로 되어 있는게, principal은 aws 계정으로 되어있고, action은 SQS 전부로 되어있다.
  • 주문 현황을 누구나 이용 가능하게 해주려면 Principal을 "*" 이걸로 변경해줘야 한다.

  • 그리고 대기열 생성하면, topic 하나를 생성한 것이다.
  • SQS 큐에 접근할 수 있는 url을 발급 해준다.

  • 메세지 주고 받는 걸 오른 쪽 위에 메시지 전송 및 수신에서 테스트 해볼 수 있다.

  • 아무 메시지를 작성한 후, 전송을 누른다
  • 그리고 오른쪽 밑에 메시지 폴링을 누르면 쌓여 있는 메시지를 볼 수 있다.

  • 수신 수가 2개인 거는 큐에 쌓아놓고, 폴링을 눌러서 메시지를 받은 후, 삭제하지 않고 쌓아놔서 다시 폴링을 했을 때, 쌓여있는 (삭제하지 않은) 메시지를 다시 보내줘서 2번이라고 쓰여져 있는 것이다.

  • 메시지 ID를 클릭하면 본문을 볼 수 있다.
  • 그런데 우리가 해야하는건 여기서 확인하는게 아닌, 다양한 어플리케이션에서 이 메세지를 주고 받을 수 있냐이다.

송신

import boto3

sqs = boto3.client('sqs')

queue_url = 'https://sqs.ap-northeast-2.amazonaws.com/23492309470119/자신의 큐 이름'
for i in range(100):
    response = sqs.send_message(
        QueueUrl=queue_url,
        MessageBody=(f'hi{i}')
    )
  • 메시지를 100개 전송하는 코드이다.

수신

import boto3

sqs = boto3.client('sqs')

queue_url = 'https://sqs.ap-northeast-2.amazonaws.com/23492309470119/자신의 큐 이름'
response = sqs.receive_message(
        QueueUrl=queue_url,
        AttributeNames=['All'],
        MessageAttributeNames=['All'],
        MaxNumberOfMessages=10,
        VisibilityTimeout=0,
        WaitTimeSeconds=0
)

messages = []
sqs.delete_message(
    QueueUrl=queue_url,
    ReceiptHandle=receipt_handle
)    
if 'Messages' in response:
    messages.extend(response['Messages'])
for m in messages:
    print(m['Body'])

  • 큐에 쌓여있는 메시지들을 빼오는 코드이다.
  • 최대 0개에서 10개까지 빼올 수 있으며, 우리는 fifo 방식으로 만들지 않았기 때문에 랜덤으로 오게 된다.
  • 그리고 최소 1개의 메시지들을 보내기 때문에 중복된 메시지가 올 수 있다

실시간으로 메시지 받아오기

import boto3
import time
sqs = boto3.client('sqs')
queue_url = 'https://sqs.ap-northeast-2.amazonaws.com/자신의 것'

while True:
    response = sqs.receive_message(
        QueueUrl=queue_url,
        AttributeNames=['All'],
        MessageAttributeNames=['All'],
        MaxNumberOfMessages=1,
        VisibilityTimeout=0,
        WaitTimeSeconds=20
    )
    
    if 'Messages' in response:
        # 메시지 처리 코드를 추가합니다.
        mess = response['Messages'][0]
        print(mess['Body'])
        sqs.delete_message(
        QueueUrl=queue_url,
        ReceiptHandle=mess['ReceiptHandle']
        )    
    # 일정 시간마다 루프를 중단하고 다시 시작합니다.
    time.sleep(5)
  • 실시간으로 메시지를 뽑아내는 코드이다.

  • aws 콘솔에서 메시지를 보낸다면

  • 실시간으로 나오게 된다.

  • 만약 delete_message 코드로 sqs에 쌓이는 메시지를 삭제하지 않으면 계속해서 똑같은게 오게된다.

  • 한번 보내면 큐에서 삭제를 해줘서 같은게 못오게 해줘야한다.

  • SQS를 이용해서 채팅도 이용할 수 있다.

  • 실시간으로 받는 코드를 구동 시켜놓은 상태에서, 아래의 코드를 구동시켜서 입력하면 실시간으로 채팅처럼 나오게 된다.

채팅 보내기 코드

import boto3

sqs = boto3.client('sqs')

queue_url = 'SQS에서 할당받은 url'
while True:
    message = input()
    response = sqs.send_message(
        QueueUrl=queue_url,
        MessageBody=(message)
    )
  • 근데 이러면 보내는 사람은 입력만 할 수 있고, 받는 사람은 입력한 사람의 메시지를 보는것 밖에 못한다.
  • 좀만 더 생각해서 쌍방으로 주고 받을 수 있게 해보도록 하겠다.
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글