Node.js

node>AWS에 Node.js 서버 배포하기 (Elastic Beanstalk)

연습노트 2024. 9. 19. 09:25

터미널 열고 node server.js 아니면 nodemon server.js 입력해두면 

이러면 여러분 컴퓨터에서 서버를 운영할 수 있습니다. 

이제 http://님컴퓨터의ipv4주소:8080 으로 접속하면 사이트 접속이 가능한데 

컴퓨터 24시간 켜둘 것입니까 

그러지 말고 안전하게 클라우드 서비스에서 컴퓨터 빌려서 서버를 띄워놔봅시다. 

사람들 많이 쓰는 AWS를 이용해봅시다. 

 

 

 

 

AWS Elastic Beanstalk 쓸건데

 

실은 AWS에는 EC2 상품이 가장 유명한데 그냥 컴퓨터 한대를 빌리는 상품입니다.

그 컴퓨터에다가 nodejs 설치하고 코드넣고 똑같이 서버띄워놓으면 끝이긴 한데

하지만 터미널을 안써봤으면 터미널 써서 그런 짓거리하는게 매우 오래걸리고

서버가 맛이갔을 때 자동 재시작도 해야하니 pm2 이런 라이브러리로 셋팅해둬야하고

나중에 이상해졌을 때 문제해결도 알아서 해야합니다.

 

그래서 보통 편하게 하려면 AWS Elastic Beanstalk 상품 사용하면 됩니다.

얘는 코드만 올리면 지가 알아서 자동으로 EC2 인스턴스 빌려서

npm install 눌러주고 node server.js도 눌러주고 무료 도메인도 하나 연결해주고 

Nginx로 reverse proxy도 알아서 넣어주고

유저 많아지면 확장도 쉽게 가능하고 버전관리도 해주고 서버다운시 자동으로 재시작 여러번 시도해주고

여러분은 그냥 코드 업로드밖에 신경쓸게 없습니다. 

가격도 그냥 EC2 요금이랑 같습니다. 

 

AWS는 새 계정생성 + 새 카드 등록하면 1년간 무료로 저사양 컴퓨터 한대 빌려줍니다.

그러니까 그러고 싶으면 새 계정 만들어서 카드등록까지 마칩시다. 

 

경쟁업체들의 비슷한 상품은 구글의 App Engine, 마이크로소프트 Azure에는 App Service가 있습니다.

역시 처음 카드등록하면 무료 사용량 줍니다.

 

 

 

 

 

배포전 체크사항

 

지금 MongoDB를 호스팅받아서 쓰고 있는데 

AWS 컴퓨터도 MongoDB에 접속을 해야 데이터를 꺼내든말든 할 것 아닙니까 

 

 

 

▲ mongodb.com 들어가서 좌측 Network access 메뉴에서

접속가능 IP를 0.0.0.0 으로 모든 IP에서 접속가능하게 바꿔줍시다. 

더 안전하게 하고 싶으면 나중에 AWS VPC로 mongodb atlas 연결하는 법 같은걸 찾아서 적용해줍시다. 

 

 

 

 

 

 

배포하려면 1. 소스코드를 zip 파일로 압축합니다

 

 

 

프로젝트 폴더안에 있는 모든 내용을 .zip 파일로 압축합니다. 

node_modules 폴더는 굳이 넣지마쇼

 

 

 

배포하려면 2. AWS 로그인하고 카드등록하고 

 

- 카드등록까지 해야 똥컴 1년 무료렌탈권을 주기 때문에 카드등록 하면 되고

- 로그인하면 우측 상단에 지역선택을 할 수 있는데 사이트를 서울에서 운영할거면 '서울'로 들어옵시다.

 

 

 

배포하려면 3. IAM 역할만들기 

 

AWS 사이트 상단 검색창에 IAM 검색해서 들어갑시다

 

 

▲ 좌측 메뉴의 역할 눌렀을 때

aws-elasticbeanstalk-ec2-role 역할 이름이 없으면 역할 만들기 누릅니다. 

elastic beanstalk이 ec2 맘대로 사용할 수 있게 만드는 부분임 

 

 

(1단계) 신뢰할 수 있는 엔터티는 AWS 서비스, 사용사례는 EC2 선택

 

 

▲ (2단계) 권한추가메뉴에선

AWSElasticBeanstalkWebTier

AWSElasticBeanstalkWorkerTier

AWSElasticBeanstalkMulticontainerDocker

3개 찾아서 체크마크

 

 

 

 

▲ (3단계) 이름 지정부분은 aws-elasticbeanstalk-ec2-role 기입하고 끝냅시다. 

 

 

 

 

 

 

실은 하나 더 만들어야합니다.

(1단계) AWS 서비스, Elastic Beanstalk 선택하고 

 

 

 

 

 

(2단계) 위와 같은 정책 2개 넣어야하고 

 

 

 

 

 

 

(3단계) 이름 지정부분은 aws-elasticbeanstalk-service-role 기입하고 끝냅시다.

 

실은 Elastic beanstalk 처음 만들 때 IAM 설정은 알아서 해줬었는데

지금은 쓸데없이 직접 해줘야합니다.

 

[collapse]

 

 

 

 

 

배포하려면 4. Elastic beanstalk

 

- AWS 사이트 상단 검색창에 Elastic beanstalk 검색해서 들어갑시다. 

 

 

▲ 그럼 앱생성이나 환경생성 버튼 어딘가에 있을텐데 그거 눌러서 진행합시다. 

 

 

 

 

(1단계) 이거저거 적으라고 나올텐데 

- 애플리케이션 이름 아무거나 작명하고 

- 환경 이름 잘 작명하고 

- 플랫폼은 nodejs 18버전으로 합시다. 실은 님들이 쓰던 버전이 좋습니다. 

- 프리셋 선택하라고 나오면 우리는 거지니까 '단일 인스턴스' 고릅시다. 

 

 

 

 

 코드 업로드 눌러서 아까 만든 소스코드 zip 파일 올려줍시다. 

버전레이블도 이쁘게 알아서 작성합시다. 방금 업로드한 소스코드 버전 기록용임 

다음으로 넘어갑시다. 

 

 

 

 

 

(2단계) ▲ 여기서는 위처럼 잘 되어있나 체크하고 넘어갑시다. 

안되어있으면 위에서 IAM 설정이 안된 것임 

 

 

(3단계) 건드릴 필요없음 

 

 

 

 

(4단계) ▲ t2.micro가 프리티어에서 쓸 수 있는 기기라서 이거 설정해줍시다. 

돈내고 빠른걸 원하면 더 상위사양 + 여러 인스턴스를 설정하도록 합시다. 

간혹 배포이상하게 안되면 램부족 이슈라 t2.small 이상으로 써보면 됩니다. 

나머지는 만질 필요 없고 다음 다음 누르면 배포 끝입니다. 

 

 

몇분 기다리면 어쩌구.com 주소 뜨는데 거기 들어가면 님들 사이트로 개나소나 접속이 가능합니다. 

- 까먹고 1년 냅두다가 요금청구되기 싫으면 안쓰는 환경은 삭제합시다. 

- AWS 검색창에 S3 입력해서 거기 있는 데이터 백업본도 삭제해야 요금으로부터 안전할 수 있습니다.

- 이미 배포된 프로젝트의 .env 환경변수를 수정하려면 환경눌러서 설정부분 눌러봅시다.

 

 

 

 

 

- 구성 메뉴에선 님들 환경 설정이 가능합니다. 

- 로그 메뉴에선 터미널 로그출력이 가능합니다.

- 상태 메뉴에선 인스턴스 안쓰는게 있으면 끄고 재부팅하고 그럴 수 있습니다. 인스턴스는 가상 컴퓨터 한대임 

- 모니터링을 자동으로 해줍니다. 

400, 500 에러같은게 너무 잦거나 접속이 안되는 페이지가 있으면 알려줌 

- 참고로 환경마다 하나의 application을 실행해둘 수 있는데 

application은 프로젝트 버전1개라고 생각하면 됩니다.

 

 

Node.js 서버는 원래 자동으로 메모리 관리를 해주는데 가끔 메모리 이슈로 서버가 다운되는 케이스가 종종 들려옵니다. 

대부분 여러분이 코드를 이상하게 짜서 그런 것일 수 있지만 

그래서 실제 서버들은 최소 2개의 인스턴스를 띄워놓고

인스턴스 하나가 죽으면 다른 인스턴스가 응대하는 식으로 안전하게 셋팅하는 경우가 많습니다. 

죽은 서버는 어짜피 Elastic Beanstalk이 자동으로 재시작해줍니다. 

아니면 재시작 조건같은걸 설정할 수 있는 pm2라는 라이브러리 쓰는 사람들도 있습니다. 

 

 

 

 

 Q. 저는 사이트 업데이트하고 싶은데요

- 업로드 및 배포 버튼 눌러서 또 코드 zip 파일로 묶어서 업로드하면 됩니다.

새로 생성하는건 요금 안나오는데 재배포는 너무 자주하면 1년무료로 사용중이어도 elastic compute cloud 요금이 청구됩니다.

 

 

Q. 사이트 접속이 안되는데요 

- 로그메뉴에서 터미널 로그같은거 출력해볼 수 있는데 그거 뒤져보면 에러원인을 알 수 있습니다.

 

 

Q. 저는 배포시 이상한 AWS elastic beanstalk 100.0 % of the requests are erroring with HTTP 4xx 에러가 나오는데요 

- 메인페이지 접속이 불가능하면 보통 그렇습니다. 

보통 DB접속 셋팅안해놔서 그런 경우가 많아서 위에서 MongoDB 셋팅 제대로 했나 확인합시다.

 

 

Q. 배포시 안되어서 로그출력해보니 npm ENOMEM 에러가 나오는데요 

- 램부족이라 인스턴스 사양을 t2.small 이상으로 수정해봅시다. 

 

 

Q. The instance profile aws-elasticbeanstalk-ec2-role 어쩌구가 없다는 에러 나오는데요 

- 위에서 IAM 역할 만드는게 잘못되면 그래서 역할 지우고 다시만듭시다.

 

 

Q. 배포실패나 HTTP 5xx 에러가 나오는데요

대부분 코드가 이상해서 에러났다는 뜻인데

정확한 에러메세지는 로그메뉴 들어가서 로그 출력하면 터미널 에러메세지같은게 나와서 그거 보고 검색해보는게 좋습니다. 

Node.js 18버전 쓰는데 힙스터처럼 자바스크립트 최신문법인 ?? ?. 이런거 쓰는 경우에도 자주 그렇습니다.