마이크로서비스를 이용한 서비스를 만드는 프로젝트를 진행하였다.
총 정리할 일수는 Day-3까지 정리할 예정이다. Day 일수가 커질 수록 난이도도 점점 올라가게 된다. 인간은 망각의 동물이기 때문에 다시한번 상기 시키기 위하여 블로그 정리를 통해 더 오랫동안 기억되길!
우리는 마이크로서비스 아키텍처로 서버, 데이터베이스, API배포 자동화를 진행 해 볼것이다. 목표하는 아키텍처의 다이어그램은 다음과 같다.
aws SQS를 이용하여 느슨한연결을 하여 비동기적으로 처리되는 아키텍쳐를 구성할 것이다.
목표: serverless 프레임워크를 통해서 람다 함수를 배포하기
"input": 1
이라는 요청 바디를 받아서 2
라는 응답을 보내면 성공!
"input": 1
이라는 바디를 처리할 코드를 작성 후 람다 함수로 배포 가능한 형태로 변경.
service: aws-node-sqs-worker
frameworkVersion: '3'
provider:
name: aws
runtime: nodejs14.x
region: ap-northeast-2
functions:
producer_consumer:
handler: legacy-handler.producer_consumer # legacy-handler 라는 파일 안에 producer_consumer 라는 함수를 사용하겠다는 뜻
events:
- httpApi: # 람다 함수를 실행시킬 트리거를 http post 요청으로 설정.
method: post
path: /producer_consumer
plugins:
- serverless-lift
# serverless deploy 명령어를 통해 람다 함수를 배포할 수 있다.
serverless deploy
명령어를 통해 람다 함수를 배포한다. 나는 aws로 배포를 하기 때문에 aws-cli 환경설정을 미리 해두었다.
하지만 바로 배포하게 된다면
Error:
Serverless plugin "serverless-lift" not found. Make sure it's installed and listed in the "plugins" section of your serverless config file. Run "serverless plugin install -n serverless-lift" to install it.
라는 에러를 만나게 된다. 이것은 플러그인이 설치되지 않았기 때문에 나타난 오류이다.
serverless plugin install -n serverless-lift
로 가볍게 해결.
배포를 완료하면 다음과 같은 화면을 마주친다.
POST 엔드포인트를 다음 curl
요청에 반영하고
curl -w "@curl-format.txt" --location --request POST 'https://end_point' \
--header 'Content-Type: application/json' \
--data-raw '{
"input": 1
}'
요청을 보내면??
{"message":"Message accepted! Result: 2"}
--------------------------------
time_namelookup: 0.026313s
time_connect: 0.039847s
time_appconnect: 0.078626s
time_pretransfer: 0.078784s
time_redirect: 0.000000s
time_starttransfer: 0.078809s
----------
time_total: 5.439698s
이러한 요청이 오게 된다. 밑에 시간이 나타나는 이유는 우리가 코드에 넣었던 딜레이 타임이 실제로 동작하는지 확인하기 쉽게 만들어진 것이다. curl-format.txt
파일은 여기를 클릭하면 볼 수 있다.
만약 에러가 발생한다면 aws cloudwatch에서 확인이 가능하다.
step-1을 통해 서버리스 프레임워크를 이용하여 aws lambda를 배포했다. 더 심화된 내용을 배우기 위해 다음 스텝으로 넘어가보자
목표: SQS 이용하여 Producer-Consumer 구조 개발 학습
여기step-2의 코드가 준비되어 있다. 이 예제 코드를 이용하여 curl요청시 SQS에 큐를 넣어 컨슈머가 해당값에 1을 더하는 구조를 만들었다.
serverless.yaml파일은 다음과 같다.
service: aws-node-sqs-worker-1
frameworkVersion: '3'
provider:
name: aws
runtime: nodejs14.x
region: ap-northeast-2
constructs:
jobs:
type: queue
worker:
handler: handler.consumer # handler.js 파일 안에 consumer라는 함수를 사용한다.
functions:
producer:
handler: handler.producer # handler.js 파일 안에 producer라는 함수를 사용한다.
events:
- httpApi: # http POST요청을 보내면 트리거가 되어서 이 함수를 실행하게 된다.
method: post
path: /produce
environment: # 환경변수를 serverless.yaml파일에 정의하는 방식
QUEUE_URL: ${construct:jobs.queueUrl} # 현재 파일 line:9 로 인해 만들어질 aws SQS의 url을 사용한다.
plugins:
- serverless-lift
이 코드를 deploy
시키면 자동으로 messagequeue 와 dead-letter-messagequeue가 생기게 된다.
배포 후 curl 요청을 보내면 위와 같이 결과가 나타나게 되면 성공이다! 이제 우린 로그를 봐야한다.
Result: 2
라는 값이 나오게 되면 메시지큐가 큐를 소모해 결과값에 1을 더한 결과 값이 나온 것이므로 잘 처리가 되었다.
목표: SNS-SQS 환경에서, SNS 발행서버 구현
준비된 코드를 이용해 aws콘솔에서 sns를 구독하는 sqs를 연결해서 로컬 test를 하면 로컬 -> sns -> sqs
로 진행되는 구조를 만들어볼 것이다
테스트를 위해서 1번째 단계인 메시지를 생성해서 SQS가 구독하는 단계까지 진행
index.js
를 로컬에서 실행시키고 curl요청을 보내면 다음과 같은 결과가 나타난다.
$ node ./index.js
SNS App listening on port 3000!
{
MessageGroupId: 'stock-empty-group',
subject: '부산도너츠 재고 부족',
message: '재고 부족',
MessageAttributeProductId: 'CP-502101',
MessageAttributeFactoryId: 'FF-500293'
}
{
ResponseMetadata: { RequestId: '940bf151-3fbe-55f5-ad83-ab8d5f8eec3f' },
MessageId: '7352a88d-dc59-5a75-9190-f251bc6953bf',
SequenceNumber: '10000000000000028000'
}
$ curl --location --request POST 'http://localhost:3000/send' \
--header 'Content-Type: application/json' \
--data-raw '{
"MessageGroupId": "stock-empty-group",
"subject": "부산도너츠 재고 부족",
"message": "재고 부족",
"MessageAttributeProductId": "CP-502101",
"MessageAttributeFactoryId": "FF-500293"
}'
목표: “부산도너츠" 마이크로서비스 시나리오 환경구성
준비된 코드를 이용해서 데이터베이스에 있는 수량을 소진시키고 전량 판매완료가 되어 재고 부족
상태가 되었을 때 sns를 거쳐 sqs에 메시지큐가 전달되는 구조를 만들었다.
시작하기에 앞서 먼저 데이터베이스를 만들고 데이터베이스안에 테이블들을 만드는 쿼리를 작성한다.
코드를 실행시키고
curl요청을 보내면 판매완료
라는 결과가 리턴된다.
여기서, 만약 모두 판매가 되고 재고가 없는 상황이 되면 다음과 같은 결과를 반환한다.
이 메시지가 보이게 된다면 아마 sns를 통해 sqs로 메세지가 갔을 것이다 aws콘솔을 이용하여 확인해보자.
잘 도착했다 :)
람다와 sqs, sns, cloudWatch를 이용하여 서버리스 3-tier-architect를 구성하고 만들어 보았다. 이를통해 서버리스에 대한 이해와 구조 등을 공부할 수 있었고, 서버리스의 확장성과 가능성을 배우는 뜻깊은 하루였다.