[AWS] Lambda 비동기화(@Slack)

xgro·2022년 11월 6일
0

AWS

목록 보기
15/18

작성하는 이유

  • 동기화되어 작업중인 Slack worker를 Queue를 이용하여 비동기화 하여 서비스의 안정성을 높이고자 합니다.

  • AWS 리소스를 관리하는 방안으로 Slack을 이용하여 커맨드를 전달하고 있습니다.

  • Slack 커맨드 사용시 timeout은 3초로 고정되어 있어, 해당 시간동안 Response가 도달하지 못하면 ( 3초 이상 작업이 소요될 경우 ) 슬랙봇은 에러를 반환합니다.

(As-is)Slack 메시지

위 그림은 현재 서비스가 구성된 다이어그램입니다.

슬랙으로 커맨드를 전송하면, API gateway의 라우팅 계획에 따라 Lambda로 이벤트가 발생합니다.

람다에서는 Base64로 인코딩된 요청을 디코딩하여 요청 기능을 수행하게 됩니다.

이때, 관리중인 ECS의 전체 리스트를 출력하거나, 시작, 정지를 요청할 경우 응답하기 까지 3초가 넘어버리는 경우가 발생합니다.

아래는 Lambda의 로그 중 일부입니다.

이 경우, Slack은 응답코드 200과 상관없이,

에러가 발생했습니다.

메시지를 반환하며, 커맨드를 종료하게 됩니다.

(To-be)메시지 큐를 이용한 비동기 처리

AWS 관리형 서비스인 SQS(Simple Queue Service)를 이용하여 요청에 대한 작업을 비동기적으로 처리하여, Slack 커맨드의 timeout 에러를 해결할 수 있습니다.

Lambda_trigger

import json
import boto3
import os

QUEUE_URL = os.getenv('QUEUE_URL')

SQS = boto3.client('sqs')

def lambda_handler(event, context):
    body=event['body']
    
    # print(body)
    
    SQS.send_message(
        QueueUrl=QUEUE_URL,
        MessageBody=body
    )
    
    # TODO implement
    return {
        'statusCode': 200,
        'body': ""
    }

작업을 트리거 하기 위한 람다는 간단하게 구성할 수 있습니다.

Event를 SQS로 전달하고, statusCode를 200으로 응답하는 과정만 수행합니다.

Lambda_worker

# 기존
body = event['body']
# 변경
body = event['Records'][0]['body']

작업을 수행하는 람다는 요청에 대한 body 값이 기존과는 다르게 전달되므로, 해당 부분을 구조에 맞게 변경해주면 간단하게 기능을 연동할 수 있습니다.

Conclusion

AWS 완전관리형 서비스인 SQS를 이용하여 간단하게 람다를 비동기하는 방법을 적용할 수 있습니다.

profile
안녕하세요! DevOps 엔지니어 이재찬입니다. 블로그에 대한 피드백은 언제나 환영합니다! 기술, 개발, 운영에 관한 다양한 주제로 함께 나누며, 더 나은 협업과 효율적인 개발 환경을 만드는 과정에 대해 인사이트를 나누고 싶습니다. 함께 여행하는 기분으로, 즐겁게 읽어주시면 감사하겠습니다! 🚀

0개의 댓글