안녕하세요!
오늘은 파이썬을 이용하여 AWS의 서비스 중 하나인 sqs를 사용하여 메세지를 전송해 보는 시간을 가져보겠습니다.
SQS
Simple Queue Service는 마이크로 서비스, 분산 시스템 및 서버리스 애플리케이션을 위한 완전 관리형 메세지 대기열로 데이터 값을 보내고 받을 수 있는 사람을 제어하거나 Lambda 같은 이벤트 함수를 발생시켜서 다른 함수를 실행하거나 비동기 작업 처리를 할 수 있습니다.
IAM 권한 추가
우선 서비스를 사용하기 위해선 권한과 엑세스 키, 시크릿 엑세스 키가 필요합니다.
저는 미리 만들어 두었던 IAM 계정이 있어서 엑셀파일에서 가져오겠습니다.
IAM에서 사용하려는 ID를 누른 뒤 권한을 추가해 줍니다.
만약 IAM을 아직 만들지 않았다면 여기에서 먼저 만들고 진행해 주시길 바랍니다.
React로 AWS S3 연결해서 사진 올리는 방법(리액트)
SQS 만들기
저는 따로 설정을 두지 않았고 이름만 변경해서 생성했습니다.
파이썬을 활용하여 메세지 전송하기
import boto3
#SQS 함수 생성
def sqs(arg, time):
aws_access_key_id = '퍼블릭 액세스 키'
aws_secret_access_key = '시크릿 액세스 키'
region_name = '리전'
# 큐 이름
queue_name = '큐 이름'
# AWS 클라이언트 설정
sqs = boto3.client('sqs',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name=region_name)
# 큐 생성
response = sqs.create_queue(QueueName=queue_name)
queue_url = response['QueueUrl']
print("큐가 생성되었습니다.")
# 메시지 전송
message_body = f"{arg} : {time}"
response = sqs.send_message(QueueUrl=queue_url, MessageBody=message_body)
print(f"메시지를 전송했습니다. : {arg}")
우선 메세지를 보내는 함수입니다.
메세지를 보내기 위해 퍼블릭 액세스 키, 시크릿 액세스 키와 리전, 큐 이름을 적어줍니다.
그리고 메세지를 전송하는 내용은 message_body에서 보내고 싶은 메세지를 보낼 수 있습니다.
특정한 상황에서 메세지 보내기
import threading
import random
import time
# 랜덤 값을 생성하는 함수
def generate_random():
return random.randint(1, 20)
# 첫 번째 스레드 함수
def thread_function():
global thread2_value, start_time, count
while True:
if count == 5:
event.set()
return
# 랜덤 값 생성
time.sleep(0.1)
value = generate_random()
# 현재 스레드의 값 설정
thread2_value = value
# 두 스레드의 값이 같은지 비교
if thread1_value == thread2_value:
print(f"두 값이 같습니다! : {thread1_value}")
end_time = time.time()
elapsed_time = end_time - start_time
print(f"값이 같을 때까지 걸린 시간: {elapsed_time:.2f} 초")
count += 1
sqs(thread1_value, round(elapsed_time, 2))
# 두번째 스레드 함수
def default_thread_function():
global thread1_value, start_time
while True:
if event.is_set():
return
# 랜덤 값 생성
time.sleep(0.1)
value = generate_random()
# 현재 스레드의 값 설정
thread1_value = value
print("thread1_value", thread1_value)
# 시작 시간 기록
start_time = time.time()
# 각 스레드가 생성한 값 변수 초기화
thread1_value = None
thread2_value = None
# 변수 생성
event = threading.Event()
count = 0
# 두 개의 스레드 생성하여 함수 실행
thread1 = threading.Thread(target=default_thread_function)
thread2 = threading.Thread(target=thread_function)
# 스레드 시작
thread1.start()
thread2.start()
# 스레드가 종료될 때까지 대기
thread1.join()
thread2.join()
두 개의 스레드를 사용하여 코드를 구현했고 첫 번째와 두 번째 스레드에서 랜덤 한 수가 계속해서 생성됩니다.
생성되는 두 수가 일치하는 타이밍에 메세지를 보내는 함수입니다.
메세지의 내용은 두 수가 일치했던 숫자와 함수가 시작되고 발동되는 시간을 담아서 보냅니다.
결과 확인
위의 코드에서 count를 5를 주고 실행해서 5개의 메세지를 보냈습니다!
aws에 메세지가 잘 왔는지 확인해 보겠습니다.
두 개의 값이 같았던 순간의 변수는 2였고 시간은 0.1초가 지난 후에 실행되었습니다!
aws에서도 메시지가 잘 도착 한걸 보실 수 있어요.
만들었던 sqs를 누르고 메세지 전송 및 수신 탭에서 메시지 폴링을 누르면 받았던 메세지를 확인할 수 있습니다.
여기까지 python을 사용하여 sqs 메세지를 전송하는 방법이었습니다.
더 나아가서 단순한 메세지를 전송하는 기능뿐만 아니라 특정한 Lambda 함수를 발생시키는 다양한 방법으로 발전할 수 있는 기능입니다.
Lambda를 사용하는 방법은 이곳에서 확인해 주세요!
AWS Lambda를 사용해서 파일 업로드할 때 이벤트 발생시키기