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 |