BE 2명(필자 포함), FE 1명 구성으로 LOL을 주제로 사이드 프로젝트를 시작했다.
프로젝트의 주제는 롤 듀오 서칭 플랫폼
이다. 대략 다음 같은 서비스를 제공할 예정이다.
롤 계정 전적 검색
유저 간 1:1 채팅 기능
롤 계정 구독 기능
챔피언 조합(2개) 승률 데이터 제공
챔피언 상세정보 제공
이 프로젝트에 대한 시리즈를 별도로 제작한 까닭은 프로젝트를 하면서 새로 배우는 기술들 그리고 주요한 의사결정들의 근거에 대한 기록을 남기기 위해서이다. 경험컨대, 직접 만들면서 맥락적으로 경험하는 것이 기술에 대한 가장 크고 빠른 배움이라고 느꼈기 떄문에, 프로젝트를 중심으로 배운 내용을 기록하고자 한다.
이 프로젝트에서 사용해볼 주요한 기술은 다음과 같다. 프로젝트 과정에서 스택은 계속 추가될 여지가 있다.
framework
- nest.js
DB
- TypeORM
- PostgreSQL
- Redis
Infra
- AWS EC2
- AWS CodeDeploy/CodePipeLine
- Ngnix
- PM2
- github action
Library
- axios
Https(Ngnix)
CI/CD(github action/AWS CodeDeploy)
무중단배포(PM2 or Ngnix)
로드밸런싱(AWS or Ngnix)
CD는 쉽게 말하면, 지속적 제공/배포 자동화
를 의미한다.
배포할 EC2 instance와 프로젝트 Github을 연동시켜서, github의 특정 branch에 새로운 커밋이 추가되면 이것이 자동적으로 EC2 instance에 배포되게끔 하는 기술인 것이다.
즉, 수동적으로 EC2 instance에서 git pull을 하지 않아도 되기 때문에, 도입만 한다면, 개발 생산성이 매우 높아질 수 있다. 그래서 다른 기술들보다 가장 먼저 챌린지하여 적용했다.
CD를 적용하는 것은 AWS 인프라에 대한 일정 수준의 이해를 요구했다. EC2, IAM, CodeDeploy 등을 직접 만져야하는데, 아직 AWS 인프라에 대한 이해 수준이 매우 낮아, 공식문서만으로 CD를 적용하는데는 한계가 있었다.
그래서 참고자료의 블로그를 거의 따라하다시피...
하면서 CD를 구현할 수 있었다. 블로그를 따라하면서 구현한 만큼, 추후에 시간을 내어, CD를 적용하기 위해 밟아야하는 각 절차/단계들이 어떤 의미인지를 정리하고자 한다.
지금 여기서 작성하려고 하는 것은 아래 참고자료에 근거하여 CD를 적용하면서, 필자가 느꼈던 점 + 이를 해결했던 점을 중심으로 작성하고자 한다.
즉, appspec.yml은 프로젝트 root 경로 + 배포할 서버의 root 경로 모두에 필요하다.
{
"apps": [
{
"name": "carryduo",
"script": "./project-carryduo/node_modules/.bin/ts-node",
"args": "./project-carryduo/src/main.ts",
"watch": true
}
]
}
1. appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/build/
hooks:
AfterInstall:
- location: scripts/after.install.sh
timeout: 300
2. after.install.sh
#!/bin/bash
sudo chmod -R 777 /home/ubuntu/build
#navigate into our working directory
cd /home/ubuntu/build
#install node modules & update swagger & pm2 reload
sudo npm ci
sudo npm run build
sudo pm2 reload carryduo
AWS로 CD 적용하는 법: https://iot624.tistory.com/180
ecosystem.json: https://pm2.keymetrics.io/docs/usage/application-declaration/