본문 바로가기

⭐ AWS/AWS SQS

AWS SQS + Lambda를 활용하여 메세징 서비스 구현

1. AWS SQS서비스를 구현하기 위한 구성요소

- Producer : 처리할 작업 메시지를 SQS에 등록
- Trigger : 큐(Queue) 대기열에 있는 메시지들을 조회하기 위해 CloueWatch의 스케줄 이벤트를 이용하여 매 분마다 Lambda Consumer 실행
- Consumer : Lambda Consumer는 큐 대기열에 있는 메시지 목록을 조회하여 각 메시지를 Lambda Worker에서 처리할 수 있도록 실행
- Worker : Lambda Worker는 메시지를 받아 작업을 처리하고 해당 메시지를 삭제

2. AWS SQS 서비스 생성

- 큐 생성하기 : AWS SQS 서비스 이동 > 대기열 생성을 클릭하여 큐 생성

- 큐의 이름과 구성 옵션을 설정 합니다.

- 생성된 대기열을 확인 합니다.

3. AWS Producer Lambda(람다) 생성하기

- AWS Lambda 서비스로 이동 > 함수생성

- 정상적으로 함수가 동작하는지 확인

const AWS = require('aws-sdk') 

exports.handler = async (event) => { return AWS.VERSION; };

- 아래와 같이 테스트 코드를 입력 후 Deploy > Test 를 수행하면 결과값이 나타난다.

- 결과 값

4. SQS로 메세지를 보내기 위한 샘플 코드는 아래와 같습니다.

(해당 코드를 람다 index.js에 넣고 실행을 하면 AWS SQS에 대기열에 쌓이는 형태가 된다.)

const AWS = require('aws-sdk')

exports.handler = async(event) => {
    const sqs = new AWS.SQS({ apiVersion: '2012-11-05' });

    const params = {
        MessageBody: "This is Test Massage...",
        QueueUrl: "https://sqs.ap-northeast-2.amazonaws.com/[개인 Queue 경로 입력]"
    };

    try {
        const response = await sqs.sendMessage(params).promise();
        return JSON.stringify(response)
    }
    catch (e) {
        console.log(e)
    }
};

- node 파일 실행 방법 (실행전 node.js가 설치 되어 있어야 한다, 로컬에서 테스트할 경우)

# 설치 유무 확인 node --version node 파일명.js # aws-sdk 설치 방법 
- vs code에서 해당 js 파일이 있는 경로에서 js 파일 열기 
- npm init - npm install 
- npm install 'aws-sdk' 
- 실행 node ./파일명.js

5. lambda 함수에서 SQS를 호출할 수 있는 권한을 설정

- 람다 서비스로 이동 > 이전에 생성한 람다 함수 클릭

- 람다 함수 권한설정: 람다 > 구성 > 권한 > 실행역할 > "편집"
- 기존에 지정된 역할을 클릭하여 해당 역할의 IAM으로 이동한다.
- 역할 이름을 클릭 후 정책 연결을 클릭하여 해당 정책을 연결한다.

- AmazonSQSFullAccess 권한을 추가하고, 정책 연결을 클릭하여 해당 서비스를 사용할 수 있도록 연결한다.

- 위의 예제코드를 실행 시킨 후 결과를 보면 아래와 같다.

- AWS SQS 대기열에 대기 큐가 쌓인것을 볼 수 있다. 사용 가능한 메세지가 쌓여있는 대기열 이라고 볼 수 있다.

6. 메세지 Consumer Lambda 생성하기

- SQS에서 메세지를 소비하는 람다 함수를 생성 합니다. 함수 생성 방법과 권한 수정은 Producer 람다 함수와 동일하게 진행 합니다. 예제 코드는 간단하게 받은 메세지를 출력하는 예제를 사용 합니다.
- my-queue-service-lambda-consumer 라는 consumer 함수를 생성 합니다.
- 권한은 producer 함수인 my-queue-service-lambda 함수와 동일하게 설정 합니다.
- 아래와 같이 설정되어 있으면 정상적으로 정책이 부여된 것입니다.

- 샘플 예제 코드 > 해당 코드를 my-queue-service-lambda-consumer 함수에 입력 > Deploy를 수행한다.

exports.handler = async (event) => { console.log('consume sqs message event', JSON.stringify(event)) };

7. Consumer lambda 함수의 트리거로 AWS SQS를 추가합니다.

- AWS Lambda > my-queue-service-lambda-consumer > 함수개요 > 트리거 추가

- 트리거 추가를 클릭하고 기존에 생성하고, 현재 큐가 쌓여있는 SQS 서비스와 SQS 대기열을 선택 후 추가를 클릭하여 생성 합니다.

- AWS SQS 서비스에서 정상적으로 람다 함수가 연결 되었나 확인
- 정상적으로 연결 되었다면, 아래와 같이 람다 트리거가 연결된 것을 확인 할 수 있다.

- 현재 구성환경의 서비스가 정상적으로 구현 되었나 확인하기
- AWS SQS 대기열 확인하기 > 이전에 쌓여있던 11개의 메세지가 처리된것을 확인 할 수있다.

- CloudWatch에 로그 이벤트를 확인해보면 정상적으로 메세지가 전달되어 출력된 것을 확인 할 수 있다.

- 끝 -
AWS SQS로 ... 무엇을 더 할 수 있을까?