현재 프로젝트는 aws EC2를 이용하여 배포하고, 변경 사항이 있을때마다 해당 서버에 접속해 git pull을 받아 다시 반영하는 형태였습니다. 여기서 늘 문제점이 front 코드가 원격 서버에서는 build가 되지 않는 문제가 있었습니다. 이전에도 이슈에 대해 언급을 한적이 있었는데 이유를 알게되었습니다. 바로 메모리 부족으로 JavaScript heap out of memory 이슈였습니다. 초기에 프리티어를 쓰려고 t2.micro를 사용했었는데 t2.micro같은 경우에는 메모리가 1GB밖에 안되는거였습니다. 사실 하드웨어 지식이 부족한 저인데, 이전에 사이드 프로젝트 백엔드 팀원분이 프리티어는 구멍가게 수준이다라는 말을 왜 했는지 이제서야 이해가 가더라고요... 사실상 하나의 기능만 있는 게시판 CRUD정도 굴릴 수 있는 정도?인 것 같습니다
swap file을 이용하여 메모리 늘리기
맨 처음 시도로는 스왑 파일을 이용하여 메모리를 늘리는 방법이 있었습니다
https://repost.aws/ko/knowledge-center/ec2-memory-swap-file
이 방법을 시도해봤지만 build때 결국 메모리 부족 에러가 뜨더라고요. 사실 이것도 다행?이긴합니다. 이전에는 원격 서버가 너무 과부하가 갈렸는지 반응조차 없었으니까요...ㅋㅋㅋ
결국 인스턴스 업그레이드
그냥 기존처럼 매번 build 파일 pull 받아서 할까 싶었지만, 점차 고도화를 해보고 싶은 욕심도 있어서 결국 인스턴스 유형을 바꾸기로 했습니다. 정말 최소한만 늘리고 싶었기에 어떤 유형을 선택해야하나 고민하던중 챗GPT한테 도움을 받았습니다.
<기존 인스턴스 t2.micro>
- vCPU : 1
- 메모리 : 1GB
- 시간당 비용 : 약 $0.0116 (한 달 약 $8.35)
실제로 한달에 8달러 + 리소스 사용했을때 16달러 정도 나왔습니다
<t3.small>
- vCPU: 2
- 메모리: 2GB
- 시간당 비용: 약 $0.0208 (한 달 약 $15.22)
<t3.medium>
- vCPU: 2
- 메모리: 4GB
- 시간당 비용: 약 $0.0416 (한 달 약 $29.95)
<t2.medium>
- vCPU: 2
- 메모리: 4GB
- 시간당 비용: 약 $0.0464 (한 달 약 $33.37)
이 중 저는 t3.small을 선택했습니다. 아마 한달에 +@ 돼서 20달러 나오지 않을까 싶습니다. 기존 인스턴스를 중지 시키고 유형 변경 후 멈췄던 서버, docker를 재가동 시켰습니다. 이번엔 front 코드를 원격 서버에서 빌드했는데 빠르게 빌드 되었습니다!!!
github actions로 자동 배포
매번 변경 사항이 일어날때마다 원격 서버에 접속해서 pull 받고 다시 pm2 재실행하는게 불편했었는데요. 젠킨스를 구축해볼까 하다가 아직은 뭔가... 배보다 배꼽이 더 커지는 느낌같아서 github actions를 이용해보기로 했습니다
해당 레파지토리 actions 탭에 들어가서 set up a workflow yourself 선택,
name: main branch auto ci process script
on:
push:
branches: [ main ]
jobs:
deploy:
name: deploy
runs-on: ubuntu-latest
steps:
- name: excuting remote ssh commands
uses: appleboy/ssh-action@v0.1.9
with:
host: ${{ secrets.REMOTE_IP }}
username: ${{ secrets.REMOTE_USER }}
key: ${{ secrets.REMOTE_PRIVATE_KEY }}
port: ${{ secrets.REMOTE_SSH_PORT }}
script: | # 실행될 스크립트
nvm use v16.20.2
cd /home/???/run-code-IDE
git pull
cd front
npm run build
pm2 restart app
같이 작성해줍니다
여기서 이미 ec2이든, 원격 서버가 있어야합니다
- host : 서비스 IP 주소
- username : 원격 서버 아이디 (따로 설정 안했으면 ec2-user)
- key : ec2 pem key (vscode로 열어서 싹 다 전체 복사)
- port : 접속 포트 (보통은 22)
그리고 script는 본인 환경에 맞게 작성해주시면 됩니다. 저는 해당 플젝으로 이동하고 pull 받고 프론트 코드를 빌드하고 pm2를 재실행 하는 명령어를 쭉 썼습니다!
그리고 commit changes...를 누릅니다
그 다음 시크릿 변수를 설정해주시면 됩니다
해당 레파지토리 설정에 들어가셔서 new repository secret를 클릭해서 위에 작성해주신 변수명대로 추가해주시면 됩니다.
그러나 문제점
제가 한가지 크게 놓친 부분이 있습니다...
바로 인스턴스가 변경되면 주소가 싹 다 바뀐다는것을요... 사실 바꾸기전에 엥? 보통 이런건 경고문 없나?? 그냥 되네? 아무런 변화가 없나보다 역시 aws!! 이랬거든요.... 근데 역시나 주소가 모두 바뀌었고.... 하... 이 주소로 된 이력서로 접수를 굉장히 많이 했는데 말이죠...^^..... 레파지토리를 프라이빗으로 바꾸려다가 그러면 github actions를 쓸 수 없어서.... 인프라에 대해 잘 모르니 이런 실수를 했네요... 크게 경험 했으니 다음번에는 이런 실수 하지않도록 해야겠습니다 늘 주의주의...
'Project > WEB IDE' 카테고리의 다른 글
Socket.io 오버헤드 최적화하기 | Web IDE 구축하기 - 6 (0) | 2024.08.27 |
---|---|
React + express(node.js) + Docker 프로젝트 AWS EC2 배포 후기 | Web IDE 구축하기 - 5 (2) | 2024.05.15 |
Docker 내부에 코드 복사 및 실행 | 터미널 입력 줄바꿈 처리 문제 | Web IDE 구축하기 - 4 (1) | 2024.05.12 |
코딩테스트용 Web IDE 구축 회고 | Web IDE 구축하기 - 3 (0) | 2024.04.10 |
Docker로 각 컨테이너마다 Java, C++, Python, Node.js 언어 실행시키기 | Web IDE 구축하기 - 2 (0) | 2024.04.06 |
댓글