본문 바로가기
Project 3

Devops Day 57 (5.25) Project 3_마이크로서비스_Day 2

by Jackykim 2023. 5. 30.

Github - Repository for Project

목표

- 메시지 큐의 Pub/Sub 패턴과 Producer/Consumer 패턴의 차이를 이해한다

- DB와 서버와의 통신이 가능하도록 연결한다

- 특정 상황에서 SNS, SQS로 메시지가 전달되도록 시스템을 구성한다

- SQS에 들어온 메시지를 레거시 시스템(Factory API)으로 전달하는 시스템을 구성한다

- 레거시 시스템(Factory API)의 콜백 대상이 되는 리소스를 생성해 데이터베이스에 접근할 수 있게 한다

 

Step 1 - Lambda 서버(Sales API) - DB 연결

1. git clone 후 sales-api 디렉토리로 들어가 CLI에 “serverless deploy” 합니다.
2. Serverless deploy 후 MYSQL / Dbeaver 통해 database 값 (table 기입)
3. 로컬에서 확인하는 방법은 “npm install mysql2 –save” -> mysql -h {database url} -u {user} -p {password} 
- mysql 접속 후 해당 user로 (use team*) -> show 명령어로 database 확인

- show databases; / show tables; etc

4. .env 작성
- sales-api 있는 폴더에 npm start + npm install -> 다시 serverless deploy
- curl -X Get sales-api endpoint/값(product/donut) 기입 하면 값이 나옵니다
.

 

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

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

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

2.1 AWS SNS 들어가 -> 주제 하나 생성 합니다
.

2.2 AWS SQS에서 SNS에 연결할 대기열 생성합니다.

- 생성 완료 하면 SNS 구독 데시보드가 생깁니다. 아까 생성한 SNS 와 연결합니다.

2.3 받은 코드에 TopicArn: process.env.TOPIC_ARN 부분을 SNS 주제 ARN으로 변경 다시 serverless deploy 이나 curl 명령으로 내용 확인 있습니다.
-
하단 code snippet sales-api handler.js 추가 serverless deploy 합니다

- serverless deploy 다시 npm start -> curl -X GET -i localhost:8080/product/donut

- SNS / SQS curl 경우 권한 문제로 error 메시지 발생
-
문제 해결하기 위해 AIM 정책에 SNS 권한 부여

- 권한 부여 후 curl -X POST -H "Content-Type: application/json" -d '{"MessageAttributeFactoryId": "factory123"}' -i localhost:8080/checkout 하면 메시지 “구매 실패! 재고: 0” 확인

2.4 Sales API 대상에 SNS 추가 후 하단 데시보드에 환경 변수 편집하여 .env 키값을 추가

- Curl 했을 때 AWS Cloudwatch에서 Error 확인

해결 :
1. Sales-api handler.js 코드 에서 TopicArn을 hard coding 대신 .env 로 수정하였습니다.
2. Curl 명령어 수정 -> curl -X POST https://.execute-api.ap-northeast-2.amazonaws.com/checkout --header 'Content-type: application/json' --data-raw '{ "MessageAttributeFactoryId": " bcc166b8-fac8-11ed-933d-0a67f04805fe" }' -> Factory ID 추가 및 checkout 추가
3. AWS SQS 대기열에 사용 가능한 메시지에 1 표시

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

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

- stock_queue에 들어온 메시지를 소모하기 위한 stock_lambda 구성
- 👉 stock-lambda 프로젝트 및 코드는 제공되지 않습니다. 여러분이 배운 방법을 활용하여 직접 람다 함수를 생성하세요. 람다 함수의 로그(CloudWatch)를 통해 stock_queue로부터 오는 메시지를 확인하고 SQS에 메시지가 삭제되었다면 성공입니다.

- stock_queue에서 메시지가 사라지는 것과 stock_lambda에서 생성된 로그 확인

3.1 AWS Lambda에서 함수 생성 -> 생성할 때 권한 부분에 들어가 AWSLambdaSQSQueueExecutionRole 권한 부여 필수

- SQS 대기열에 DLQ 위한 대기열 생성합니다.

- 트리거에 SQS stock_queue 하고 연결

 

3.2 연결 후 curl -X Post 진행하면 Cloudwatch에 내용이 표시 됩니다.
- 하단 메시지가 뜨면 DLQ 연결이 완료 됬습니다.