AWS ec2 인스턴스에 Node.js Express서버 올리기

Wonjun Jang
10 min readMay 1, 2021

프로젝트를 진행함에 있어서 서버로 선택할 수 있는 것은 굉장히 많다. 또한 실제로 백엔드 서버가 필요가 없을 수도 있기 때문에 local에서 테스팅을 해도되지만, 내가 만든 무언가를 호스팅하고 웹에 띄우기 위해서는 계속적으로 작동하는 서버가 있어야 한다. 이번 포스팅에서는 먼저 AWS ec2에 올리는 방법을 정리해본다. 이 글이 누군가에게는 꼭 큰 도움이 되길 바란다.

전체적인 큰 그림을 미리 말해주자면 다음과 같다.

  1. AWS 계정 생성
  2. EC2 인스턴스 생성
  3. EC2 인스턴스에 PC 또는 Mac에서 접속하기
  4. Node.js와 Express 설치
  5. 서버 구동 및 ec2 포트 설정, 외부에서 public IP로 접근하기

먼저 AWS 계정부터 생성해보자.

AWS에 접속하여 오른쪽 상단에 보이는 `콘솔에 로그인`을 클릭한다. 그리고나서 AWS에 계정 만들기를 선택한 후 계정을 만들어준다. 그러고나서 생성한 계정으로 AWS에 로그인을 하게되면 다음과 같은 화면이 나올 것이다.

이때 왼쪽 상단 네비게이션에 서비스를 클릭하면다음과 같이 AWS에서 제공하는 여러가지 서비스가 나열된 메뉴가 제공된다.

이때 모든 서비스 밑에 컴퓨팅에서 EC2를 선택한다. 그렇게한다면 다음과 같은 EC2 대시보드 페이지로 이동한다.

이때 왼쪽 메뉴에서 인스턴스라는 카테고리 하위에 인스턴스를 클릭하면 다음과 같이 현재 존재하는 인스턴스들의 상태를 보여준다. (현재 필자는 인스턴스를 2개 구동하고 있다. 따라서 읽는 이는 처음 가입하고 생성을하는 것이라면 인스턴스가 없을 것이다.)

오른쪽 상단의 `인스턴스 시작` 버튼을 클릭한다.

그러면 단계 1: Amazon Machine Image(AMI)선택으로 이동하게 되는데 여기서는 본인이 생각하는 서비스에 맞게 선택을 하면된다. 하지만 이번 예시에서는 혼자서 백엔드를 가지고 무료로 이용해보는 것의 연습이기 때문에 ubuntu 18.04 LTS(HVM), SSD Volume Type을 선택할 것이다.

선택을 하고나면 위와 같이 인스턴스 유형 선택 페이지로 오게 되는데 현재 우리는 무료, 무엇보다 저가에 이 모든 서비스를 이용하고 싶기 때문에(또한 혼자서 프로젝트를 진행한다면 굳이 돈을 쓸 필요는 없으니…) 들어가자마자 선택된 그룹 t2에 t2.micro를 선택하고 그대로 오른쪽 하위에 있는 파란색 `검토 및 시작` 버튼을 선택한다. 그러면 단계7: 인스턴스 시작 검토 페이지로 이동하는데 이때 바로 시작하기를 눌러준다. 이렇게하면 다음의 화면으로 이동하게 되는데 여기서 정말정말 중요하다. 이때 AWS ec2인스턴스에 접근할 수 있는 Key를 받는데, 이것은 절대, 절대, 절대 잃어버리면 안된다. 새로 발급 받기도 어렵고 보안 상 꽁꽁 숨겨둬야 한다. 깃헙 같은데에 올려서 aws 이용료 5000만원 나오는 경험을 하고 싶지 않다면… 정말 꽁꽁 local어딘가에 숨겨두자:)

`새 키 페어 생성`을 클린한 후 키 페어 이름을 작성해준다. 그러고 나서 키 페어를 다운로드 한다. 다운로드된 .pem 파일은 local의 안전한 곳에 저장한다.

그 후 `인스턴스 시작`을 눌러준다.

만약 위와 같이 나오면 인스턴스 만들기에 성공한 것이다!

이제 인스턴스가 생성이 되었으면 인스턴스들이 모두 표시되는 창에 인스턴스가 새롭게 추가된 것을 확인할 수 있다.

인스턴스의 ID를 클릭해서 들어가면 다음과 같은 화면이 보일 것이다.

이제는 이 인스턴스에 local 콘솔에서 접속을 해보기로 하겠다. window라면 cmd를 이용하겠지만… 이 예시에서는 gitbash를 쓴다는 점에 양해를 구한다.

만약 gitbash가 없다면 cmd를 써도 되지만 gitbash를 다운로드 받아서 쓰는 것을 추천한다. 필자는 gitbash가 편하다. 터미널에서 .pem이 있는 디렉토리로 이동한 후 다음과 같이 작성해준다.

ssh -i C:\Users\example\medium-example.pem ubuntu@[퍼블릭 IPv4 주소]

위의 예시를 보면 퍼블릭 IPv4주소는 54.180.91.94로 적어둔다. 그러면 다음처럼 될것이다.

ssh -i C:\Users\example\medium-example.pem ubuntu@54.180.91.94

저 IP주소는 본인의 퍼블릭 IPv4로 대체한다.

그리고 작성해주면..!

짠!! ec2 instance에 접속을 하게 된다. 처음 ec2에 들어오면 해줘야하는 것들을 하도록 하겠다.

$ sudo apt update

이 명령어를 치면 ubuntu18버전을 업데이트하게 된다. 그렇다면 이제 NodeJS와 Express를 설치해보자

먼저 nodejs와 npm을 모두 설치해줘야 된다. npm이 뭔지 모른다면.. 검색해보는 것을 추천한다. npm은 nodejs package manager의 약자이다.

중요한 것은 설치 할 때의 nodejs와 npm의 버전인데 이것은 본인의 서버로 사용할 프로그램의 dependency의 버전에 따라서 상당히 많이 상이할 수 있기 때문에 어느 버전을 설치할지 잘 알아보는 것을 추천한다. npm dependency tree오류가 나면 상당히 골치가 아프기 때문이다… 한 가지 첨언을 하자면 라이브러리를 npm을 이용해서 설치할때 버전 호환을 체크하는 습관을 가지길 바란다.

그렇다면 nodejs와 npm은 어떻게 설치하느냐..? 다음의 명령어를 이용한다.

$ sudo apt install nodejs
$ sudo apt install npm

설치를 했다면 다음의 명령어를 통해 nodejs의 버전을 확인하도록 하자.

$ nodejs -v

node는 버전이 8버전으로 나올 것이다. (이건 다를 수도 있다.)하지만 현재 nodejs LTS버전은 14버전이다. 이를 설치하기 위해서 PPA라는 NodeSource에 의해 유지되는personal package archive를 이용한다.

이를 위해서 root디렉토리로 이동 후 다음의 명령어를 실행시켜주자.

$ curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh

그 후 다음의 명령어를 실행시켜서 nodesource_setup.sh를 실행시킨다. 이렇게하면 PPA가 로컬 페키지 cache에 자동으로 업데이트된다. 이 말이 무슨 뜻인지는 언젠가 제대로 설명하도록 하겠다.

$ sudo bash nodesource_setup.sh

위의 명령어를 실행해줬으면 다시 한번 nodejs를 설치해준다.

$ sudo apt install nodejs

그러고나서 nodejs 버전을 확인해보면 14버전이 설치된 것을 확인할 수 있다.

그러고나서 npm도 잘 설치된 것을 확인할 수 있따. 이 경우 npm은 6버전을 쓴다.

이제 nodejs와 npm을 설치했으니 express를 설치하고 예시용 서버코드를 하나 작성해보자.

먼저 express를 설치한다. express는 다음의 명령어를 이용해서 설치한다.

$ npm i express

이 글에서는 express 서버용 코드가 모여있는 것이 좋을 것 같다. 따라서 디렉토리를 생성해준다.

$ mkdir Server_example // 디렉토리 생성 명령어
$ cd Server_example // 디렉토리로 이동

그 후 npm init 명령어를 사용해서 npm 환경을 생성한다.

$ npm init

그 후 express를 설치해준다.

$ npm install express

그리고 같은 디렉토리에 index.js를 생성해서 간단한 서버코드를 작성해주자.

서버코드는 다음과 같다.

const express = require('express');
const cors = require('cors');
const app = express();
app.use(express.json());
app.get('/', (req, res) => res.send('linked!'));
app.listen(8001, () => console.log('Server Up and running at 8001'));

그리고 나서 nodemon이라고 하는 라이브러리를 설치해주는데 이 라이브러리는 서버코드가 바뀔때 자동으로 서버를 다시 실행해주는 라이브러리다.

또한 cors라는 라이브러리도 설치해주는데 cors의 경우 다른 origin에서 오는 요청에도 응답을 해줄 수 있게끔 설정해주는 라이브러리다. 네트워크 통신에 대한 부분이라고 이해하면 된다.

$ npm i nodemon
$ npm i cors

설치해주고 난 이후에 디렉토리 내에 있는 package.json에 다음과 같이 작성해준다.

{
"name": "server_example",
"version": "1.0.0",
"description": "Server example",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"start": "nodemon index.js"
},
"author": "",
"license": "ISC"
}

자 이제 서버를 실행시켜보자.

$ npm start

이렇게하면 다음과 같이 나올 것이다.

현재 서버는 8001번 포트로 신호를 받을 수 있게 열린 것이다. 그렇다면 이제 마지막으로 이 ec2 인스턴스에 외부에서 신호를 보내서 response를 받아보자. 이를 위해서는 postman이라는 REST 통신에 자주 쓰이는 tool을 이용하기로 한다.

이 이후의 내용은 다음에 올리도록 하겠다.

--

--