목표: 공장 api REST API 문서 배포를 자동화 하기
openapi.yaml을 redoc-cli
로 빌드해서 EC2로 배포를 해보자. 근데 변경사항이 생길 때 마다 수동으로 배포를 하면 효율성이 많이 떨어지게 된다. 그래서 쉘 스크립트
로 배포를 자동화 해보자.
ubuntu 18 LTS 이미지를 사용하여 EC2를 생성하였다.
보안그룹 인바운드 규칙에 HTTP를 추가하자.
이제 접속하여 환경구축을 해주자(컨테이너를 이용해 공장 API를 배포할 계획)
ssh -i "hengsgg-naver.pem" ubuntu@ec2-13-125-148-94.ap-northeast-2.compute.amazonaws.com
.pem키가 있는 위치에서 명령어를 실행시켜준다.sudo apt update
, sudo apt install docker.io
를 실행시켜 도커를 설치한다.docker
라는 이름의 디렉토리를 하나 생성하여 준다.mkdir docker
openapi.yaml을 빌드하기 위해서 redoc-cli
를 실행한다.
1. npm i -g redoc-cli
2. redoc-cli build openapi.yaml
3. mv redoc-static.html index.html
이제 배포 할 index.html파일이 생성되었다.
#!/bin/sh
redoc-cli build openapi.yaml
rm -rf index.html
mv redoc-static.html index.html
# 여기까지 로컬에서 실행되는 스크립트
scp -i "/Users/baghyeongseog/keypair/hengsgg-naver.pem" index.html ubuntu@ec2-13-125-148-94.ap-northeast-2.compute.amazonaws.com:~/docker
scp -i "/Users/baghyeongseog/keypair/hengsgg-naver.pem" Dockerfile ubuntu@ec2-13-125-148-94.ap-northeast-2.compute.amazonaws.com:~/docker
ssh -i "/Users/baghyeongseog/keypair/hengsgg-naver.pem" ubuntu@ec2-13-125-148-94.ap-northeast-2.compute.amazonaws.com 'sudo docker build ~/docker -t server'
ssh -i "/Users/baghyeongseog/keypair/hengsgg-naver.pem" ubuntu@ec2-13-125-148-94.ap-northeast-2.compute.amazonaws.com 'sudo docker rm -f server'
ssh -i "/Users/baghyeongseog/keypair/hengsgg-naver.pem" ubuntu@ec2-13-125-148-94.ap-northeast-2.compute.amazonaws.com 'sudo docker run -d -p 80:80 --name server server'
# 여기까지 EC2에서 실행되는 스크립트
EC2에 접속할 때 ssh -i "hengsgg-naver.pem" ubuntu@ec2-13-125-148-94.ap-northeast-2.compute.amazonaws.com
와 같은 ssh명령어를 입력하면 접속이 되는데 로컬에서 실행 결과만알고 싶을 때는 앞에 명령어 뒤에 '실행할 명령어'
를 붙히면 실행 결과만 가져올 수 있다.
이제 저 스크립트를 실행시키면 다음과 같은 결과가 나온다.
잘 배포가 되었는지 확인해 보자.
잘 배포가 되었다.
하지만 중요한건 로컬에서 변경한 파일이 작 적용되는지가 중요하기 때문에 Factory-api 버전을 1.1.1로 변경하여보자
잘 변경된다!!
목표: 공장서버의 콜백 메시지를 받아 재고를 추가하는 람다를 구현하기
이제 api도 생겼고 데이터베이스와 람다까지 있으니 공장에서 생성된 재고를 데이터베이스에 추가하는 과정을 만들 것이다.
service: aws-node-stock-add
frameworkVersion: '3'
provider:
name: aws
runtime: nodejs14.x
region: ap-northeast-2
environment:
PASSWORD: dxx_user_secret
HOST_RDS: project3-db-for-xxxxxxx.xxxxxxx7ewnt.ap-northeast-2.rds.amazonaws.com
USER_RDS: dob_uxxx_c-3
DATABASE_RDS: xxxxxxxx-3
functions:
api:
handler: index.handler
events:
- httpApi:
method: post
path: /send
plugins:
- serverless-lift
serverless.yaml로 배포를 하면 트리거가 httpApi: post
인 함수가 배포가 된다.
배포된 함수가 실행된 결과는 다음과 같다.
이 함수가 실행되는 과정은
API GATEWAY
를 통해 aws-node-sell-request
함수가 실행된다.Database
에서 재고를 조회하여 재고가 있다면 구매자에게 판매를 하고 만약 없다면 SNS
로 알림을 보내게 된다.SNS
를 구독하고 있는 SQS
에게 큐가 생성되면 aws-node-post-stockEmpty
함수가 실행된다. 만약 람다함수에게 전달되지 못하면 SQS-DLQ
로 큐가 이동하여 관리자가 조회하여 처리하게 된다.aws-node-post-stockEmpty
함수가 실행이 된다면 공장API로 요청이 전송된다.aws-node-stock-add
함수가 실행이 된다.글로보면 무슨말인지 나도 몰라보겠다..
하지만 우리에겐 다이어그램이 있기 때문에 한 눈에 이해가 될 것이다.
만약 위의 서비스에 다른 서비스를 추가하고 싶다면 다른 SQS를 이용하여 메시지 큐에 기반한 마케팅, 광고 등등 다양한 서비스를 추가할 수 있다.
하지만 위와같은 서비스가 하나의 코드 즉, 모놀리식 아키텍쳐였다면 서비스를 추가하는게 정말 어려운 일 일것이다. 마이크로서비스를 구성해 봄으로써 느슨한 연결과 서비스의 확장에 관한 영향을 잘 알게 되었다. 기업들이 MSA에 열광하는 이유가 이런 점 때문이 아닐까?
프로젝트를 진행하면서 '나' 혼자 진행한 것은 아니다. 하지만 '모두'가 이 시스템을 구성하는 것을 이해하고 잘 배포를 해보아야 하기 때문에 각자의 인프라에 구성을 하였다. 구성하는 과정에서 나도 이해가 잘 안되고 어려운 부분이 있어서 잘 따라오지 못하는 팀원에게 도움을 많이 주지 못해서 아쉬운 마음이 들었다.
일일이 알려주기에는 시간이 부족하여 어쩔 수 없었지만 나의 실력이 늘면 그만큼 여유가 생거 다른사람에게 도움을 줄 수 있는 사람이 되지 않을까 기대해본다..