AWS ElasticBeanstalk 으로 NestJS(Node.js 기반) app 배포하기

김연봉·2021년 9월 3일
1

동기

최근 진행중인 프로젝트에서 NestJS 와 React 를 통해 프로젝트를 한달간 진행 하게되었고, 일종의 1.0 알파? 버전을 배포 해야하는 상황이되었습니다. PM님 으로부터 GCP 혹은 AWS ElasticBeanstalk 로 배포시, 관리하기 쉽다는 이야기를 듣게 되었고, 그나마 AWS는 사용했던 경험도 있고 친숙하여 AWS ElasticBeanstalk 를 배포 환경으로 선택하게 되었습니다.

NestJS 란?

NestJS 는 Node.js 기반의 서버 앱 프레임워크 입니다. 내부적으로 express 를 사용하고 있으며, 높은 추상화, 모듈화 구조를 제공하여, 모듈 재사용과, 테스트가 용이하다는 장점이 있습니다. 실제 한달동안 사용해본 느낌은, 컨트롤러/서비스/레포지토리/엔티티를 모듈로 생성하여 구현 해야하며, 실제 의존성 주입은 NestJS 에 의해 이루어지는 점 등이 스프링부트와 매우 유사하다는 느낌을 갖게 만들었습니다.

AWS ElasticBeanstalk (이하*aws-eb) 란?

플랫폼과, 구성/배포 환경을 설정하고, 앱을 아카이브 파일(.war/.zip 등) 형태로 업로하면 AWS ec2 인스턴스, RDS, 로드밸런서 등을 자동으로 구성하여 배포/관리 해주는 무료 서비스 입니다. 무료로 시작하기를 클릭하여 구성해보는 경우, 로드밸런서는 추가되지 않고 ec2 인스턴스가 마이크로 타입으로 생성됩니다. 참고로 aws 콘솔 구성 메뉴에서 인스턴스, RDS 와 로드밸런서 등을 추가/삭제 할 수 있습니다.

구성

  1. 로컬 개발 환경에 EB CLI 설치 권장. (배포,인스턴스 접속시 매우 유용함.)
  2. ec2(Amazon Linux 2/Node.js14) + rds(mysql5.7) 등으로 구성.

빌드/배포

  1. aws-eb 에 정해진 포맷의 zip 또는 war 파일등으로 앱을 업로드하고 배포 하는 방식 (aws 콘솔 이나 EB CLI 등을 통해서 가능)
  2. NestJS 프로젝트를 빌드하고, dist 폴더내의 파일과 필요에따라 배포 환경 설정을 변경해야 하는 경우(배포되는 ec2인스턴스내에 스케줄러 나 배치파일 추가 등) Proc 파일 .ebextensions, .platform 등의 폴더를 추가하여 zip 파일로 만들어 업로드함.
  3. NestJS 앱 배포시, Proc 파일 추가 필요. (aws-eb/Node.js 플랫폼에 디폴트 앱 실행 커맨드가 node app 이기 때문)
    web: node main
  4. CI/CD 를 위해 별도의 codePipeline 과 codBuild 등의 서비스 이용이 필요해 보임.
  5. SSL 설정
    1. 구성에 로드밸런서를 추가하여 https 포트와 인증서를 추가하는 방식과 로드 밸런서 추가 없이, 단일 ec2에서 ssl을 추가하는 방식이 존재, 후자 방식 선택.
    2. 참고: https://medium.com/edataconsulting/how-to-get-a-ssl-certificate-running-in-aws-elastic-beanstalk-using-certbot-6daa9baa3997

후기

이슈

NestJS 가 일반적인 express 앱 등과 다르게, 빌드 산출물에 진입점이 되는 js 파일명이 main.js 이기 때문에 정상 실행되지 않는 문제가 있었고, 배포 환경(ec2 인스턴스)에 SSL 설정을 추가 하고자 하면서 17번 재배포를 하고 디버깅 하면서 정상 배포하게 되었습니다.(로그 정보를 aws콘솔에서 제공해주지만 자세한 로그는 EB CLI 설치해서 eb ssh 커맨드로 ec2 인스턴스 접속해서 확인 하시길 바랍니다.ㅠㅠ)

느낀점

배포에 실패하여 10번 정도 재배포 하니 답답합에 그냥 ec2인스턴스에 직접 Node.js를 설치하고, 수동으로 배포 환경을 구성하고 앱을 배포 하고 싶다는 생각?욕망?을 갖게 되었습니다. 그러나 이제 조금 더 스마트한 배포 방법을 사용해보고 싶다는 생각으로 견디게?되었고, 배포 구성 파일 문제를 해결하고 앱의 새로운 버전 배포등으로 30번이 넘는 배포를 해보니, 확실히 시간 절약과, 편리함을 느끼게 되었습니다~

profile
사랑과 자유가 있는 삶을 살아내려는 개발자 입니다.

6개의 댓글

comment-user-thumbnail
2021년 11월 6일

안녕하세요
저도 nestjs를 eb에 올리는 작업을 해보고 있는데 정보도 많이 없고 잘 안되네요 ㅠㅠㅠ

혹시 조금 더 자세하게 경험 공유해주실 수 있을까요?

저의 경우 겪으셨던 것처럼 압축파일을 올리면 main.js여서 안되고 있는 듯 한데 해결 방법을 모르겠습니다 ㅠㅠ

2개의 답글