동기화되어 작업중인 Slack worker를 Queue를 이용하여 비동기화 하여 서비스의 안정성을 높이고자 합니다.
AWS 리소스를 관리하는 방안으로 Slack을 이용하여 커맨드를 전달하고 있습니다.
Slack 커맨드 사용시 timeout은 3초로 고정되어 있어, 해당 시간동안 Response가 도달하지 못하면 ( 3초 이상 작업이 소요될 경우 ) 슬랙봇은 에러를 반환합니다.
위 그림은 현재 서비스가 구성된 다이어그램입니다.
슬랙으로 커맨드를 전송하면, API gateway의 라우팅 계획에 따라 Lambda로 이벤트가 발생합니다.
람다에서는 Base64
로 인코딩된 요청을 디코딩하여 요청 기능을 수행하게 됩니다.
이때, 관리중인 ECS의 전체 리스트를 출력하거나, 시작, 정지를 요청할 경우 응답하기 까지 3초가 넘어버리는 경우가 발생합니다.
아래는 Lambda의 로그 중 일부입니다.
이 경우, Slack은 응답코드 200과 상관없이,
에러가 발생했습니다.
메시지를 반환하며, 커맨드를 종료하게 됩니다.
AWS 관리형 서비스인 SQS(Simple Queue Service)를 이용하여 요청에 대한 작업을 비동기적으로 처리하여, Slack 커맨드의 timeout 에러를 해결할 수 있습니다.
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으로 응답하는 과정만 수행합니다.
# 기존
body = event['body']
# 변경
body = event['Records'][0]['body']
작업을 수행하는 람다는 요청에 대한 body 값이 기존과는 다르게 전달되므로, 해당 부분을 구조에 맞게 변경해주면 간단하게 기능을 연동할 수 있습니다.
AWS 완전관리형 서비스인 SQS를 이용하여 간단하게 람다를 비동기하는 방법을 적용할 수 있습니다.