Section3 회고

Lee Dong Uk·2023년 5월 30일
0

프로젝트의 목표


  • AWS 클라우드 환경을 기반으로 하는 느슨하게 연결된(loosely coupled) 애플리케이션 아키택처에 대한 이해
  • SNS, SQS, DQL에 대한 이해
  • Publisher-Subscriber 패턴과 Producer-Consumer 패턴에 대한 이해
  • MSA에 대한 이해

Issues


1. Lambda 함수로 넘어오는 event객체 이해 부족

Event 객체에서, http 요청으로 받은 body에서 MessageAttributes를 가져오려는데 body에 MessageAttributes가 없다는 에러가 나왔다.

const consumer = async (event) => {
  
  console.log(event)
  const record = event.Records[0]
  console.log('body,',record.body)
  // point 1
  // 여기까진 나옴
  const {MessageAttributes} = record.body
  //에러 발생.
  console.log('body,',record.body)
  console.log('MessageAttributes,',MessageAttributes)
  const {MessageAttributeProductId} = MessageAttributes
  console.log('MessageAttributeProductId',MessageAttributeProductId)
  const sku = getValue(MessageAttributeProductId)    

};

point 부분에서 record.body의 객체에서 내가 필요로 하는 MessageAttributes가 있었지만, 계속 찾을 수 없다는 에러를 뱉어내고 있었다.

해결

record.body의 값

{
    "Type": "Notification",
    "MessageId": "xxxxx-xxxx-xxxx-xxxx-xxxxx",
    "TopicArn": "arn:aws:sns:ap-northeast-2:BlahBlah:BlahBlahBlahBlah",
    "Subject": "도너츠 재고 부족",
    "Message": "도너츠 재고가 없습니다. 제품을 생산해주세요! \n메시지 작성 시각: Thu May 25 2023 06:26:57 GMT+0000 (Coordinated Universal Time)",
    "Timestamp": "2023-05-25T06:26:57.595Z",
    "SignatureVersion": "1",
    "Signature": "BlahBlahBlahBlahBlahBlahBlahBlahBlahBlahBlahBlahBlahBlahBlahBlahBlahBlah",
    "SigningCertURL": "https://sns.ap-northeast-2.amazonaws.com/SimpleNotificationService-BlahBlahBlahBlahBlahBlahBlahBlahBlahBlah.pem",
    "UnsubscribeURL": "https://sns.ap-northeast-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=aBlahBlahBlahBlahBlahBlahBlahBlah",
    "MessageAttributes": {
        "MessageAttributeProductId": {
            "Type": "String",
            "Value": "CP-502101"
        },
        "MessageAttributeFactoryId": {
            "Type": "String",
            "Value": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
        }
    }
}

위 값처럼 JSON 객체가 직렬화 되어있었다.


  const record = event.Records[0]
  const {MessageAttributes} = JSON.parse(record.body)
  const {MessageAttributeProductId} = MessageAttributes
  const sku = getValue(MessageAttributeProductId)    

JSON.parse(record.body) 를 사용하여 해결하였다.

2. Lambda 권한 문제

serverless.yml 작성 후 serverless deploy로 배포 시도 중 lambda에서

  • SQS ReceiveMessage
  • SQS DeleteMessage
  • SQS GetQueueAttributes

관련 권한이 없어 생성하지 못하는 에러가 발생.

해결

IAM -> 역할 -> 생성하려는 LambdaRole -> 권한 추가

 "sqs:ReceiveMessage",
 "sqs:DeleteMessage",
 "sqs:GetQueueAttributes"

위 권한 추가 후 정상실행.

배운 점

에러 핸들링으로 배운 점은 아니지만

  • MSA로 아키텍쳐 구성할때 도메인은 SQS를 기준으로 나눈다.
  • SQS를 써야하는 이유는 영속성 즉, 느슨한 연결을 위한 연결다리의 역할과 메시지가 전달되는 다음 리소스에 에러가 발생해도 이전 리소스에서 전달받은 메시지를 SQS가 가지고 있어 내구성 있는 서비스를 구성할 수 있다.
  • Publisher-Subscriber 패턴과 Producer-Consumer 패턴에 대한 이해
    - (API-Gateway -> SNS(Publisher))(Producer) -> SQS(Subscriber) -> Lambda(Consumer)

0개의 댓글