티스토리 뷰

반응형

개요

Producer > Queue > Consumer를 람다와 SQS로 구현한다
이번 포스팅 구현 목표

이번 포스팅에서는 AWS Lambda(이하 람다)에서 AWS SQS에 생산한 메시지를 보내고, SQS에서 받은 메시지를 다른 람다에서 소비하는 과정을 기록하겠습니다. 람다와 SQS에 대한 기본 설명은 생략합니다.

 

1. AWS SQS 대기열 생성하기

먼저 실습을 위해 메시지를 주고 받을 SQS 대기열을 생성합니다.

Amazon SQS > 대기열 > '대기열 생성'
대기열의 이름을 지정합니다

다른 설정은 모두 기본 셋팅값으로 하여도 무방합니다. 액세스 정책 또한 람다에서 호출하기 때문에 별다른 설정이 필요 없습니다.

 

2. 메시지 Producer AWS Lambda(람다) 생성하기

실습을 위해 사용할 람다 함수를 선언합니다. 

Lambda > 함수 > '함수 생성'

람다 함수의 이름과 런타임을 지정해줍니다. (이 포스팅에서는 Node.js 12.x로 진행하였습니다.)

 

함수가 생성되면 다음과 같은 코드를 실행하여서, 람다 함수가 정상적으로 aws-sdk에 접근할 수 있는지 확인합니다. 람다에서는 다른 설정이나 계층(Layer)없이 aws-sdk에 접근할 수 있습니다. 만약 버전이 제대로 표기되지 않으면 다른 Node 버전을 사용하세요.

 

(Test 전에는 코드를 Deploy 해주세요.)

const AWS = require('aws-sdk')

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

정상적으로 aws-sdk 버전이 출력되었습니다. (2.880.0)

SQS로 메세지를 보내기 위한 샘플 코드는 아래와 같습니다. (apiVersion '2012-11-05'는 고정값입니다.)

const AWS = require('aws-sdk')

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

    const params = {
        MessageBody: "My msg body",
        QueueUrl: "https://sqs.ap-northeast-2.amazonaws.com/917722598800/My-SQS-for-Lambda"
    };

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

 

QueueUrl 주소는 대기열 정보에서 확인할 수 있습니다.

이제 람다 함수에서 SQS를 호출할 수 있는 권한을 설정해보겠습니다.

Lambda > 구성 > 권한 > 실행역할 > '편집'

설정 하단에 'IAM 콘솔에서 My-SQS-Producer-role-jcr0u6ko 역할' 링크를 클릭하여 IAM 설정화면으로 이동합니다.

'정책 연결'

람다 함수 역할에 AmazonSQSFullAccess 권한을 추가하고 저장합니다.

 

정상적으로 정책이 추가된 경우

이제 람다 함수가 정상적으로 SQS를 호출할 수 있게 됩니다. SQS 대기열을 확인하면 '사용 가능한 메시지' 항목이 0에서 1로 올라간 것을 확인 할 수 있습니다.

 

3. 메시지 Consumer AWS Lambda(람다) 생성하기

SQS에서 메시지를 소비하는 람다 함수를 선언해보겠습니다. 함수 생성 방법과 권한 수정은 Producer 람다와 동일하게 진행합니다.

실습 코드는 받은 메세지를 로그로 출력하는 간단한 예제를 사용하겠습니다.

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

 

이제 SQS를 Consumer 람다 함수의 트리거로 추가합니다.

함수 개요 > '+ 트리거 추가'

 

SQS와 Consumer 람다 함수가 정상적으로 연결되었다면, SQS 대기열 > Lambda 트리거에서 해당 목록을 아래와 같이 확인 할 수 있습니다.

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

 

참고

반응형
댓글