본문 바로가기
Project 3

Devops Day 56 (5.24) Project 3_마이크로서비스_Day 1

by Jackykim 2023. 5. 24.

Achievement Goals
AWS 클라우드 환경을 기반으로 하는 느슨하게 연결된(loosely coupled) 애플리케이션 아키택처에 대한 이해

 

Bare minimum

- Serverless를 이용한 메시지 대기열 활용 이해 및 구현

- 요구사항에 따른 애플리케이션과 인프라 구현

- 문제사항 해결을 위한 추가 리소스 생성 → DLQ, Legacy 시스템 성능문제 해결, SES

- 아키택처 다이어그램 제작

 

Advanced
인프라 관리와 재사용성을 위한 IaC 활용 → Terraform을 통한 리소스생성

Day 1 일정

프로젝트 요구사항 및 시나리오
<도넛-스테이츠>는 온라인으로 도넛을 판매합니다.

웹사이트를 통해서 주문 버튼을 누르는 것으로 구매(Sales API)가 가능합니다.

창고에 재고가 있다면 재고가 감소하고 구매가 완료됩니다.

유튜브스타 Project3 가 도넛-스테이츠의 도넛이 맛있다고 영상을 올렸습니다.

그를 따르는 데브옵스 수강생들이 몰려듭니다. 주문이 급등합니다.

창고에 재고가 없기 때문에 구매가 불가능한 경우가 발생합니다.

창고의 도넛의 재고가 다 떨어지면 제조 공장에 알려서 다시 창고를 채우는 시스템을 구축해야 합니다.

제조 공장인 <팩토리-스테이츠>에 주문을 요청(Leagcy Factory API)할 수 있습니다.

주문이 요청되면 일정 시간이 지난 후 창고에 재고가 증가합니다.

 

구성 요소

1. Sales API

2. Factory API

3. 프론트엔드(웹사이트) : cURL / postman / k6 등을 통한 API 호출로만 구현

Sales API를 통해 백엔드에 요청

4. 백엔드(서버) : 구매 시 창고에서 재고 확인 후 재고 감소 로직 구현

재고가 부족할 경우 Factory API를 통해 재고 확보 요청

데이터베이스(창고) : RDS에 mysql db 구성

요청에 따른 재고 상태 변경

 

요구사항 1 : 재고부족으로 인한 구매실패에 대한 조치

Sales API를 통해 요청을 받은 서버가 데이터베이스에서 재고 상황을 확인합니다.

재고가 있다면 감소시키고 응답으로 판매완료 내용을 전달합니다.

재고가 없는 경우 공장에 주문을 진행합니다

재고가 없다는 내용을 담은 메시지 페이로드가 주제별로 생성됩니다.

메시지가 느슨하게 연결된 시스템을 통해 처리될 수 있도록 따로 보관됩니다.

 

요구사항 2 : 메시지 누락 상황에 대한 조치

빈번한 요청으로 메시지 누락이 발생합니다.

메시지가 처리되지 않은 경우 메시지들을 체계적으로 관리할 다른 처리 공간을 생성해야 합니다.

메시지 처리 보관 리소스와 처리되지 않은 메시지 처리 리소스가 연결되어야 합니다.

 

요구사항 3 : Legacy 시스템(Factory → Warehouse) 성능문제에 대한 조치

안정적으로 이벤트가 전달될 수 있는 시스템을 구축해야 합니다.

메시지를 소비하는 리소스를 통해 Factory API가 호출됩니다.

수신된 메시지에 의해 트리거가 된 컴퓨팅 리소스가 상품 재고를 증가시킵니다.

 

Day 1
목표

- Serveless를 이용한 AWS 리소스 생성

- 메시지 Queue가 사용되는 구조 이해

 

Step 1 Serverless를 이용한 Lambda 생성
1. Serverless 튜토리얼을 통한 프로젝트 생성
1.1 Project 3 진행 하고 있는 폴더에 npm install -g serverless 기입
1.2 CLI 창에 serverless -> aws – Node.js – HTTP API 옵션 선택

1.3 Serverless.yaml 파일에서 region 설정

Error : 권한 문제로 인해 IAM 정책 설정

1.4 serverless deploy

1.5 curl -X POST https://{api -ID}.execute-api.ap-northeast-2.amazonaws.com --header 'Content-type: application/json' --data-raw '{ "input": 1 }

Step 2 – Serverless를 이용한 Lambda - SQS - Lambda 구조 생성
2.1 sls -> aws -Node.js SQS worker 선택 후 파일명 기입 후 바로 Deploy 하지 않기 (region 설정해야함)

2.2 sls deploy

2.3 AWS Lambda 함수에 들어가면 Project3-sqs-dev-producer / jobsworker (consumer) 가 생성됩니다.
- Project3-sqs-dev-producer 에 들어가면 lambda function에 API gateway가 있는 걸 확인 할 수 있습니다.
- Lambda에서 default test 할 경우 Status 400 이 뜨는 걸 확인

- 다른 test에서 event JSON “body” : “hello world” 으로 진행 할 경우 Status 200 이 뜨는 걸 확인

- Project3-sqs-dev-jobsworker 에 들어가면 lambda function에 SQS 하고 연결된 걸 확인 가능합니다.
- Cloudwatch 로그 그룹에 들어가 모니토링하면 Producer에서 test 진행한 내역을 확인 할 수 있습니다
.

2.4 step 1에 있는 내용 참고 해서 닌 index.js 코드 수정 (consumer 부분 추가)
- 수정 후 다시 배포

Step 3 – DLQ 연결 및 K6 성능테스트
3.1 Consumer 부분에 DLQ 코드 추가 후 다시 Deploy

3.2 AWS SQS에 들어가면 producer 폴더에 이동 중인 메시지 수량 볼 수 있습니다.
- 또한 dlq 메시지 전송 및 수신에 들어가면 -> 메시지 폴링 버튼 선택하면 사용가능한 메시지 확인 할 수 있습니다.

Step 3-2: Visibility Timeout 조절과 DLQ
3.1 AWS SQS 들어가 consumer sqs 선택 후 편집에서 표시 제한 시간 5초로 변경 합니다.
3.2 AWS consumer lambda 함수에서 구성 -> 편집 -> 제한 시간 20초로 변경
3.3 AWS Producer Lambda 에서 테스트 -> Cloudwatch에 표시

요구사항 분석 및 초기 다이어그램 작성