-
[78일차] Final Project Day_10교육/코드스테이츠 2023. 3. 20. 16:42
SQS 람다 생성
람다는 트리거 된 SQS를 통해 메세지를 받고 SES로 통해 매니저에게 메일을 보내야 한다.
const AWS = require('aws-sdk'); const sesClient = new AWS.SES(); exports.handler = async (event, context) => { try { const message = event.Records[0].body; const recipient = 'rlawlgnswns@naver.com'; const subject = 'SQS 메세지 알림'; const body = `새로운 메세지 입니다. : ${message}`; const response = await sesClient.sendEmail({ Source: 'rlawlgnswns@naver.com', Destination: { ToAddresses: [recipient] }, Message: { Subject: { Data: subject }, Body: { Text: { Data: body } } } }).promise(); console.log(response); return { statusCode: 200, body: JSON.stringify('메세지 전송 완료') }; } catch (error) { console.error(error); return { statusCode: 500, body: JSON.stringify('Error sending messages') }; } };
- exports.handler = async (event, context) => Lambda 함수 핸들러를 비동기 함수로 정의한다. 이 함수는 event트리거 이벤트에 대한 정보를 포함하는 객체와 context런타임 환경에 대한 정보를 포함하는 객체라는 두 가지 매개 변수를 사용한다.
- const message = event.Records[0].body;: Lambda 함수를 트리거한 SQS 대기열에서 메시지를 검색한다.
- const recipient = 'rlawlgnswns@naver.com';: 받는 사람의 이메일 주소를 지정한다.
- const subject = 'SQS Message Notification';: 이메일 제목을 지정한다.
- const body = 새 메시지를 받았습니다: ${message} ;: SQS 대기열에서 검색된 메시지 내용을 포함하는 이메일 본문을 지정한다.
오류 과정
SQS 메시지 큐에서 메시지를 받아와 SES 이메일을 보내고, 성공적으로 보낸 메시지를 삭제하려고 작성했다.
코드 내용
- SQS에서 메시지를 가져오고 이메일을 작성하고 메시지가 없으면 응답을 반환하고 종료한다.
- SQS에서 가져온 모든 메시지의 body에 이메일의 내용을 추가하고, 이메일을 보낸다.
- 이메일이 성공적으로 전송되면 SQS에서 해당 메시지를 삭제하고 응답을 반환한다.
- 메시지가 삭제되지 않으면 Lambda 함수가 오류를 반환한다.
const AWS = require('aws-sdk'); const sqs = new AWS.SQS(); const ses = new AWS.SES(); const QUEUE_URL = process.env.QUEUE_URL exports.handler = async(event) => { try { const params = { QueueUrl: QUEUE_URL, }; const data = await sqs.receiveMessage(params).promise(); if (! data. Messages) { return { statusCode: 200, body: JSON.stringify('메세지를 찾을 수 없음') }; } const emailParams = { Destination: { ToAddresses: ['rlawlgnswns@naver.com'] }, Message: { Body: { Text: { Data: `${data.Messages.map(message => message.Body).join('\n')}` } }, Subject: { Data: 'SQS 메세지' } }, Source: 'rlawlgnswns@naver.com' }; await ses.sendEmail(emailParams).promise(); const deleteParams = { QueueUrl: QUEUE_URL, Entries: data.Messages.map(message => ({ Id: message. MessageId, ReceiptHandle: message. ReceiptHandle })) }; await sqs.deleteMessageBatch(deleteParams).promise(); return { statusCode: 200, body: JSON.stringify('메세지 전송 완료') }; } catch (err) { console. log(err); return { statusCode: 500, body: JSON.stringify('Error sending messages') }; } };
오류 발생
큐 메세지를 만들고 테스트를 하는 과정에서 메세지는 사라지지만 람다 함수에서는 메세지를 찾을 수 없다는 응답을 반환했다.
원인 파악
- QUEUE_URL설정이 잘못됨.
- sqs.receiveMessage를 이용해 SQS 큐에서 메세지를 받는 문제가 발생함.
문제 해결
QUEUE_URL설정은 정상적이었고 sqs.receiveMessage를 이용해 SQS 큐에서 메세지를 받는 문제를 확인함.
문제를 찾는 과정에서 SQS 이벤트 소스를 사용하여 Lambda 함수를 트리거하면, SQS 대기열에서 메시지를 가져오는 작업 및 Lambda 함수 호출을 자동으로 처리하는것을 발견함.
즉, SQS 이벤트는 SQS 대기열에서 새 메시지가 발견되었을 때 Lambda 함수가 처리해야 하는 데이터를 제공한다. 그리고 이때 sqs.receiveMessage() 메서드를 호출할 필요가 없다.
sqs.receiveMessage()와 if( ! data. Messages), sqs.deleteMessage를 지움
'교육 > 코드스테이츠' 카테고리의 다른 글
[80일차] Final Project Day_12 (0) 2023.03.22 [79일차] Final Project Day_11 (0) 2023.03.21 [77일차] Final Project Day_09 (0) 2023.03.18 [76일차] Final Project Day_07 ~ 08 (0) 2023.03.16 [74일차] Final Project Day_06 (0) 2023.03.14