ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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
Designed by Tistory.