AWS API gateway로 SQS에 메시지 전달 후 Lambda에서 처리하기 (+CORS 설정)

준비물 : 작성완료된 람다함수

SQS 생성하기

트래픽이 몰렸을때 순차적 처리를 위한 큐이기 때문에 FIFO로 선택해서 생성했다.

콘텐츠 기반 중복 제거는 끄고 높은 처리량 옵션만 켜줬다.

중복제거 ID는 선택 사항이라고 쓰여있지만 테스트를 해봤을때 아이디를 전달을 안하니까 오류가 나서 그냥 없애버렸다.

 

그외의 옵션은 디폴트 상태로 생성 완료.

 

Lambda 트리거 설정

람다에 들어와보면 왼쪽에 트리거 추가 버튼이 있다.

소스로 SQS 선택하기

SQS 대기열에서 위에서 생성한 SQS를 선택해준다.

별다른 설정 없이 끝.

 

Lambda 코드의 경우 다음과 같다.

def lambda_handler(event, context):
    print("Lambda 실행 - SQS 메시지 처리 시작")

    for record in event.get('Records', []):
        message_body = record['body']  # 메시지 본문

        response = process_sqs_message(message_body)
        print(f"process_sqs_message response: {response}")

    return response

lambda_hadler에서 전달되는 메시지의 body값을 확인한다.

별도의 메서드를 만들어서 따로 처리를 하고 있는데 나의 경우 전달된 문자열을 json 형태로 변환해서 처리를 한다.

 

API Gateway 만들기

여기서 REST API를 선택한다. 처음에 HTTP API를 잘못 골랐다가 헤맸는데

잘 다룰 수 있다면 뭐든 상관 없을듯..

 

참고로 아래 글을 참고해서 따라했다. 아주 상세하게 잘 나와있어서 시키는대로만 따라하면 아주 잘된다!

https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/integrate-amazon-api-gateway-with-amazon-sqs-to-handle-asynchronous-rest-apis.html

 

Integrate Amazon API Gateway with Amazon SQS to handle asynchronous REST APIs - AWS Prescriptive Guidance

Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.

docs.aws.amazon.com

 

리소스 생성을 통해서 호출할 주소를 설정해준 다음 메서드를 만든다.

위에서 /online에 한번 만들어 보겠다.

 

오른쪽에 있는 메서드 생성 클릭

POST로 선택하고 리전 선택

AWS 서비스는 SQS를 선택한다.

경로 재정의 사용 선택 후 경로 재정의 칸에는

<계정 ID>/<sqs 이름> 이렇게 입력해준다.

실행 역할의 경우 iam을 미리 생성 해둬야하는데 위의 링크에 나와있는데로 생성을 하려고 했으나 sqsfullaccess가 검색이 안돼서;; 인라인으로 직접 추가해줬다.

 

이렇게만 설정하고 생성하면

안된다.

일단 완료된 화면에서 통합 요청-편집에 들어간다.

 

URL 요청 헤더 파라미터에

Content-Type | application/x-www-form-urlencoded

매핑 템플릿에는

콘텐츠 유형을 application/json

템플릿 본문

Action=SendMessage&MessageBody=$input.body

를 추가한다. 사진에는 뭐가 많은데 테스를 위해 적어둔 값이라 무시해도된다.

설정을 완료한 후에 API 배포를 반드시 눌러주자.

그럼 위와 같은 URL이 나온다.

이제 내가 생성한 API를 통해 요청이 가능하다.

 

CORS 에러 해결기

이렇게만 하면 모든게 끝난줄 알았는데 영원한 CORS 에러에 가둬졌다.

위에서 리소스 페이지를 자세히 보면 OPTIONS라는 메서드가 항상 같이 있는걸 볼 수 있는데

리소스에서 CORS 활성화를 눌러주게되면 OPTIONS 메서드가 생성이 된다.

정말 간단하게 해결이 가능한 부분인데 처음 생성을 할때 REST가 아니라 HTTP를 고르면 CORS 활성화 버튼이 없어서 정말 한참 찾았다...