프로젝트3 회고

Day2


목표

  • 메시지 큐의 Pub/Sub 패턴과 Producer/Consumer 패턴의 차이를 이해한다
  • DB와 서버와의 통신이 가능하도록 연결한다
  • 특정 상황에서 SNS, SQS로 메시지가 전달되도록 시스템을 구성한다
  • SQS에 들어온 메시지를 레거시 시스템(Factory API)으로 전달하는 시스템을 구성한다
  • 레거시 시스템(Factory API)의 콜백 대상이 되는 리소스를 생성해 데이터베이스에 접근할 수 있게 한다

Lambda 서버(Sales API) - DB 연결

HOSTNAME=project3db.cpajpop7ewnt.ap-northeast-2.rds.amazonaws.com
USERNAME=team0(0 대신 팀 번호)
PASSWORD=team0(0 대신 팀 번호)
DATABASE=team0(0 대신 팀 번호)
  • 데이터베이스의 호스트네임, 유저네임, 비밀번호, 데이터베이스 를 수정 한다.

  • 데이터베이스가 개별 제공됩니다. 로컬에서는 .env 파일을 활용하며, 배포 시에는 AWS 콘솔에서 직접 입력합니다. 코드에 credential을 넣지 않도록 주의하세요.

(advanced) serverless를 통해 lambda를 생성한다면 환경변수로 등록하는 방법을 고려해 볼 수 있습니다.

“재고 없음” 메시지 전달 시스템 구성

  • DB에 재고가 없을 경우 재고가 없다는 정보를 알리기 위한 SNS 토픽(stock_empty) 생성
  • stock_empty 토픽을 구독하는 SQS(stock_queue) 생성
  • 다음 code snippet을 활용하여 재고 부족 메시지를 SNS에 발행
 await req.conn.end()
      console.log(req.body)
      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",
          },
          MessageAttributeProductCnt: {
            StringValue: `${req.body.stock}`,
            DataType: "Number",
          },
          MessageAttributeRequester: {
            StringValue: req.body.requester,
            DataType: "String",
          }
        },
        TopicArn: process.env.TOPIC_ARN
}
console.log("보내는 메시지 결과물 : ", params)

      await sns.publish(params).promise()
      return res.status(200).json({ message: `구매 실패! 남은 재고: ${product.stock}, 생산요청 진행중`});

ARN은 Amazon Resource Number

sns의 arn 을 적어준다 arn:aws:sns:ap-northeast-2:124121153800:stock-lambda