프로젝트3

(2) “재고없음” 메세지 전달 시스템 구성 / 메세지를 Factory API로 전송하는 Lambda 구성 및 DLQ 추가

FYE 2023. 2. 20. 23:28

 

Step 2 : “재고없음” 메세지 전달 시스템 구성

 

- DB에 재고가 없을 경우 재고가 없다는 정보를 알리기 위한 SNS토픽 (stock_empty)생성

- stock_empty 토픽을 구독하는 SQS(stock_queue)생성

- 다음 code snippet을 활용하여 재고 부족 메시지를 SNS에 발행

  • 다음 코드를 적절한 곳에 붙여넣어야 합니다.
  • 환경변수 TOPIC_ARN이 필요합니다.
const now = new Date().toString()
const message = `도너츠 재고가 없습니다. 제품을 생산해주세요! \n메시지 작성 시각: ${now}`
const params = {
  Message: message,
  Subject: '도너츠 재고 부족',
  MessageAttributes: {
    MessageAttributeProductId: {
      StringValue: product.product_id,
      DataType: "String",
    },
    MessageAttributeFactoryId: {
      StringValue: req.body.MessageAttributeFactoryId,
      DataType: "String",
    },
  },
  TopicArn: process.env.TOPIC_ARN
}

const result = await sns.publish(params).promise()

 

- cURL을 통해 재고가 없을 때까지 요청을 보냄

 

 


SNS 생성하기

표준유형을 선택해서 SNS생성해준다.

 


SQS(stock_queue) 생성해주기

유형은 표준으로 선택

 


 

SNS 토픽 stock_empty에서 구독생성 클릭하기

 

 

방금 만든 SQS(stock_queue) 연결해주기

 

 

구독 완료!

 

 

 


 

cURL 요청으로 확인

curl --location --request POST 'https://api주소/checkout' --header 'Content-Type: application/json' --data-raw '{ "MessageGroupId": "stock-empty-group", "subject": "부산도너츠 재고 부족", "message": "재고 부족", "MessageAttributeProductId": "CP-502101", "MessageAttributeFactoryId": "FF-500293"}'

 

stock_queue에 메시지가 쌓였다!

 

 

 


Step 3 : 메세지를 Factory API로 전송하는 Lambda 구성 및 DLQ 추가

 

- 가용성을 높이기 위한 DLQ를 stock_queue에 연결

- stock_queue에 들어온 메시지를 소모하기 위한 stock_lambda 구성

 

 

 


서버리스 템플릿 만들어주기

serverless

starter를 선택해주고 이름은 stock-lambda로 지정해줬다.

 

 

 

serverless.yml을 수정해주자

service: stock-lambda
frameworkVersion: '3'

provider:
  name: aws
  runtime: nodejs14.x
  region: ap-northeast-2

functions:
  function1:
    handler: index.handler

리전을 ap-northeast-2로 추가해줬다

 

 

 

이제 index.js를 수정해주자

exports.handler = async (event) => {
  console.log(event)
  return event
}

 

람다 함수의 로그를 통해 stock_queue로부터 오는 메시지를 확인할 수 있게 작성한 코드입니다.

 

위의 함수는 event 매개변수를 입력으로 받아들이며 event는 AWS Lambda함수가 호출될 때 전달된 이벤트 데이터를 나타낸다.

이벤트 데이터는 호출 방법과 관련된 정보를 포함한다.

 

간단하게 console.log()를 사용하여 event를 로그에 출력한 후 그대로 반환한다.

lambda함수가 호출될 때 전달된 이벤트 데이터가 로깅되고, 그 데이터가 다시 반환되므로 이벤트 데이터를 함수로 전달하는 것이 제대로 동작하는지 확인할 수 있다.

 

async은 비동기 함수임을 나타내고, 이 함수가 완료될 때까지 호출자는 다른 작업을 수행할 수 있다.

aws lambda는 내부적으로 비동기 함수를 사용하므로 이 코드가 비동기 함수임을 나타내는 것이 좋다.

 

 


dlq생성하기

dead_letter_lambda로 이름을 정해주고 만들어줬다.

 

 


 



stock_queue편집을 눌려서 배달 못한 편지 대기열을 활성화해주자.

 

비활성화 → 활성화 

대기열선택 : dead_letter_lambda 를 클릭해준다.

 

 


stock-lambda에 SQS 트리거 추가를 해준다.

 

The provided execution role does not have permissions to call ReceiveMessage on SQS

트리거를 추가해주고 테스트를 했더니 이런 에러를 만났다

 

→ 람다에 SQS 권한 추가를 해주자

 

권한정책에서 AmazonSQSFullAccess를 추가해준다.

해결완료!

 

 


 

 

 

 

index.js 코드 수정하기

function delay(time) {
  return new Promise(resolve => setTimeout(resolve, time));
}

exports.handler = async (event) => {
  await delay(50000)
  console.log(event)
  return event
}

dlq로 넘기기위해 시간지연함수를 추가해줬다.

 

 

 

다시 curl요청을 보내면 클라우드와치에서 Task timed out 로그를 확인할 수 있다.

 

 

 sqs를 확인하면 dlq로 넘어간 것을 확인할 수 있다!

 

 

 

 

'프로젝트3' 카테고리의 다른 글

(3)  (0) 2023.02.22
Q&A  (0) 2023.02.21
(2) Lambda 서버 - DB 연결  (0) 2023.02.20
(2) 프로젝트 3 : MSA  (0) 2023.02.20
(1) DLQ 연결 및 K6 성능테스트  (0) 2023.02.19