AWS EC2를 이용해 ubuntu에서 nodejs와 mysql을 설치하고 nestjs 프로젝트를 배포한다. 전체적인 과정은 다음과 같다.
회원가입은 어렵지도 않고 검색하면 쉽게 나오기 때문에 생략하고 진행한다.
현재 한국에 있기 때문에 접속 속도를 위해 가장 가까운 서울을 선택한다.
지역을 선택하고 위에 검색 창에 "EC2"라고 검색하고 맨 위에 나오는 것을 선택한다.
EC2를 선택하면 다음과 같은 화면이 나오는데 왼쪽 네비게이션 바에서 인스턴스를 선택한다.
다음과 같은 화면이 나온다면 성공이다. 다음 사진에는 이미 한개의 인스턴스가 나와 있지만 처음 AWS를 한다면 아무 것도 없는 것이 정상이다.
이제 오른쪽 상단에 인스턴스 시작을 클릭하고 서버 컴퓨터의 정보를 입력한다.
이제 EC2 인스턴트에 접속할때 인증에 필요한 keypair를 생성해야 한다.
추가를 클릭하면 다음과 같은 화면이 나타난다.
완료하면 다음과 같이 다운로드가 완료되는데 이걸로 끝난것이 아니라 keypair는 추가적으로 권한 조정이 필요하다.
일단, 위와 같이 설정을 완료하고 인스턴스를 생성하면 다음과 같은 화면이 나타나고 인스턴트를 확인한다.
keypair는 누군가에 의해 훼손, 수정되면 안된다. 따라서 다운로드된 keypair를 바로 사용할려고 하면 "Permission denied"라는 오류가 나타난다.
이를 해결하기 위해서는 keypair의 권한을 소유자 한정 읽기전용으로 권한을 바꿔주어야 한다. 리눅스에서는 chmod 400 ~ 명령어를 사용하면 간편하게 되는 모양이지만 윈도우는 구글링을 해도 정보가 나오지 않아 직접 권한을 바꿔주면서 해결법을 찾게되었다.
먼저 다운로드 받은 keypair 파일을 우클릭해서 속성을 들어간다.
다음과 같이 사용 권한 항목에 여러가지가 보이는데 여기서 사용자인 나를 제외하고 나머지를 지워야 한다. 이를 위해서 좌측 하단에 상속 사용 안 함을 클릭한다.
다음과 같은 창이 뜨는데 첫번째를 선택한다.
그리고 사용자가 아닌 다른 것들을 선택해서 좌측 하단에 제거를 클릭한다.
그리고 사용자만 남았다면 사용자를 선택하고 좌측 하단 편집을 클릭한다.
권한을 읽기 와 읽기 및 실행을 제외한 다른 권한을 해제한다.
다음과 같은 화면처럼 된다면 끝이다. 이제 적용후 ssh를 통한 접속으로 넘어간다.
cmd를 켜고 다음과 같은 명령어를 입력한다.
$ ssh -i "keypair위치" ubuntu@"EC2 인스턴트 ip"
정상적으로 실행된다면 다음과 같은 화면이 나타난다.
지금까지 서버 컴퓨터를 대여하고 그것을 다룰수 있게 접속까지 완료했다. 당연하게도 프로젝트를 실행시키려면 본인의 컴퓨터에 nodejs를 설치하고 mysql을 설치한 것처럼 대여한 서버 컴퓨터에도 설치를 해줘야한다.
하지만 서버 컴퓨터는 이제까지 처럼 직접 사이트에 들어가서 설치하는 것이 제한된다. 따라서 명령어를 통해 설치해야한다.
nodejs 설치
ssh를 통해 서버 컴퓨터에 접속한 뒤 다음과 같은 명령어를 입력한다.
$ curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
$ sudo apt-get install -y nodejs
다음과 같으면 성공이다.
mysql 설치
똑같이 다음과 같은 명령어를 입력한다.
$ sudo apt-get update
$ sudo apt-get install mysql-server
$ sudo systemctl status mysql
mysql root 비밀번호 설정
$ mysql -h localhost -u root -p
비밀번호는 초기엔 설정되어 있지 않기에 enter를 누르면 된다.
$ use mysql
$ alter user 'root'@'localhost' identified with mysql_native_password by '설정할 비밀번호';
$ exit
$ git clone 'git repo 주소"
$ ls // 확인
프로젝트를 불러왔으면 pacakge.json을 통해 라이브러리들을 설치해야 한다.
$ cd "프로젝트 폴더"
$ npm install
테스트를 위해 프로젝트를 실행시킨다.
이전까지 과정을 통해 서버 컴퓨터에서 nestjs 프로젝트를 성공적으로 실행했다. 하지만 지금의 상태에서는 터미널 접속을 종료하거나 EC2 인스턴스가 중지될 경우 서버가 바로 종료된다.
이러한 문제를 해결하기 위해 pm2 라이브러리를 활용해서 웹 서버를 지속적으로 실행시키기 위해 다음과 같은 설정을 해줘야 한다.
pm2는 관리자권한이 필요해서 관리자 권한으로 전환한다.
$ sudo -s
다음 명령어로 pm2를 설치한다.
$ npm install -g pm2
이제 pm2를 통해 서버를 실행한다.
$ pm2 start dist/main.js
만약 추가로 EC2 인스턴스를 종료하고 다시 실행했을때 내 웹 서버가 자동으로 실행되게 하고 싶다면 다음과 같은 과정을 거친다.
$ pm2 startup
이제 다음 명령어로 저장만 하면 된다.
$ pm2 save
만약 이 옵션을 제거하고 싶다면 반대로 다음 명령어를 입력하면 된다.
$ pm2 unstartup
지금까지 서버를 실행했지만 아마 포스트맨이나 클라이언트를 통해서 서버로 api 요청을 보내더라도 응답이 돌아오지 않을 것이다.
그 이유는 EC2 인스턴스 방화벽이 http 요청을 허용하고 있지 않기 때문이다. 또한 지금의 ssh 접속은 keypair를 가졌다면 누구나 가능하다. 하지만 이는 보안상 적절하지 않기 때문에 ssh의 접속도 내 컴퓨터만을 한정해야 한다.
따라서 EC2의 인바운드 규칙을 수정하여 위와 같은 문제를 해결한다.
먼저 다시 인스턴스 목록으로 돌아간다.
원하는 인스턴스를 선택하고 보안 탭을 선택한다.
보안그룹 아래에 링크를 클릭한다.
위와 같이 나오면 우측 상단에 인바운드 규칙 편집을 클릭한다.
ssh 접속 제한
무분별한 ssh접속을 방지하기 위해 내 IP만을 허용한다.
현재 위와 같이 ip가 0.0.0.0으로 되어있는데 X를 클릭해 없애준다.
소스에서 내 IP면 자동으로 내 IP가 설정된다.
http 접속 허용
현재는 ssh만을 통해서만 접속 허용이 되어 있는데 이제 좌측 하단에 규칙 추가를 통해 http 접속도 허용을 해주어야 한다.
규칙 추가를 하고 유형은 HTTP, 소스는 IP4를 선택해주고 다음과 같다면 끝이다.
규칙 저장을 하면 저장된다.
현재의 서버는 포트가 5000으로 설정되어 있지만 http 요청의 경우 80포트로 들어온다. 그렇다면 80포트로 오는 요청을 5000 포트로 연결해주는 설정을 해야한다. 다음과 같은 명령어를 터미널에 입력한다.
$ sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 5000