프로젝트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