항해99/개발일지

20220324 개발일지 #nodeJS에서 무중단배포+배포자동화하기

paran21 2022. 3. 24. 23:05

데이터 관리 방식을 변경하면서 관련 로직 수정은 모두 끝났고, 아직 MySql에서 S3로 옮기는 부분은 구현하지 못했다.

 

그런데 데이터 옮기는 것은 우선 데이터만 잘 쌓아놓으면 나중에 진행해도 될 것 같고,

다음주에 정식 배포하기 전에 배포 쪽 문제를 먼저 마무리해야할 것 같아서 먼저 시작하기로 했다.

 

spring쪽은 다른 팀원이 진행하고 있고, github actions+codedeploy+nginx 조합으로 할 것 같다.

nodeJS도 처음에 같은 조합으로 생각하고 github actions을 시작했는데 생각보다 자료가 없었다.

그리고 찾아보다 보니 github actions를 쓰지 않고 codedeploy+codepipeline으로 하는 것도 괜찮은 것 같아서 이렇게 시도했다.

주로 참고한 블로그 시리즈는 다음과 같다!

https://ookm1020.tistory.com/4

 

GitHub과 Node.js Express를 이용한 자동배포 환경 만들기(feat. AWS-EC2, AWS CodeDeploy, AWS CodePipeline) 1편 - 까

1편에서는 AWS EC2에 Node.js Express 프로젝트를 배포하는 과정에 대해서 설명합니다. https://aws.amazon.com/ko/ 클라우드 서비스 | 클라우드 컴퓨팅 솔루션| Amazon Web Services 제조 AWS를 활용한 Siemens의..

ookm1020.tistory.com

https://iot624.tistory.com/180

 

[CI/CD] AWS CodeDeploy, CodePipeline 으로 node.js, ec2, git 배포 자동화하기

👏🏻 들어가며 오랜만에 포스팅합니다. 학교 + 회사 + 동아리로 너무 바쁜 나머지... 오늘은 AWS Codedeploy, Codepipeline 을 통한 node.js, ec2, git 을 연동해 배포 자동화를 해보겠습니다. 사실 CI/CD는 잘

iot624.tistory.com

 

하고 나서 생각해보니, spring의 경우 jar로 빌드를 해주는 과정이 필요하고 이걸 github actions이 해주는 것 같다.

그런데 nodeJS(아니면 express 때문인가?) 는 빌드해서 따로 파일을 만들어 실행하는 것이 아니라 바로 파일을 실행하면 되기 때문에 굳이 github actions를 사용하지 않아도 되는 것 같다.

노드는 이미 EC2에서 깃허브 클론을 해서 바로 코드를 돌릴 수 있고, 단지 code pipeline을 통해 깃허브에서 변경된 코드를 감지해 codedeploy로 EC2에 변경된 코드로 업데이트만 하면 되는 것 같다.

 

그 다음에 배포를 해주는 영역은 PM2를 이용하면 된다.

PM2의 --watch 속성을 사용하면 코드가 변경된 것을 감지해서 자동으로 다시 서버를 실행시켜준다.

새로운 파일을 실행하는데 시간이 오래 걸리는 경우에는 PM2의 설정을 변경해서 최대한 서버가 중단되는 시간을 줄일 수 있는 것 같은데, 현재 우리 코드는 양이 많지 않아서 그런지 한번에 중지와 재배포가 이루어지는 것 같다.

 

어제 저녁에 PM2로 돌려놓고 계속 테스트를 하고 있는데 아직 한 번도 서버가 중단되지 않았고, 변경된 사항도 잘 업데이트가 되었다.

에러가 발생한 경우에도 알아서 다시 실행시켜주는 것 같다!

(이 에러가 왜 발생하는지 파악이 안됬었는데, 다행히 프론트에서 계속 코드를 수정하면서 소켓 연결이 끊기는 경우가 있어서 발생했던 에러같다. 프론트에서 코드 수정 끝난 후에는 아직 에러가 발생하지 않았다.)

 

한 가지 이해가 안되는 부분이 있는데, github에 push하고 나서 변경된 코드를 codepipeline이 자동으로 감지하는 게 아니라, 변경 사항 릴리스를 눌러줘야지 업데이트를 하는 것 같다.

원래 이렇게 쓰는게 맞는건지, 아니면 설정을 빼먹어서 그런건지 잘 모르겠다.

다른 분들한테도 물어봤는데 spring은 code pipeline을 사용하지 않는 것 같고, 노드 분들한테 물어봐야 할 것 같다.

 


PM2에 로그가 자동으로 기록되어 EC2에 남아있는 것을 확인했다.

txt파일이라서 열어봤는데, console.log로 찍는 것도 기록되고 에러나 서버 실행과 관련된 로그들도 모두 남는 것 같다.

이 로그파일을 S3로 일정 주기마다 옮길 수 있으면 정말 좋을 것 같다!!

우선 PM2에서 로그를 관리하는 logrotate를 설치했다.

(참고자료: https://darrengwon.tistory.com/m/1120?category=858366)

기본 설정에서 매일 로그 파일을 별도로 만드는 걸로 되있어서, 우선 며칠동안 데이터가 어떻게 쌓이는지 볼 예정이다.

그리고 MySql을 S3로 옮기는 방법을 알아보면서 이 데이터들도 어떻게 옮길 수 있을지 체크해보려고 한다.

 

스프링에도 로그 파일을 저장하는 기능이 있는 걸로 알고 있어서 같이 찾아봐야겠다.