AWS를 이용한 재배포
교육기관에서 제공해줬던 NCP 서버를 이용해서 배포를 진행했었는데 교육이 끝나고나니 가차없이 서버를 삭제하셨다..ㅠ
시연영상을 이용해서 지원을 하다가 재배포가 필요할 것 같아 이틀 동안 재배포를 진행했다.
이번에는 NCP이 아니라 AWS를 이용한 배포 방법도 익혀둘 필요가 있을 것 같아서 AWS를 이용해서 배포했다.
데이터베이스랑 S3 Storage는 NCP를 이용했고, Springboot와 Node.js는 AWS를 이용해서 진행했다.
내가 새로 판 서버는 Node를 실행시키기 위한 서버로 이를 중심으로 기록해보도록 하겠다.
먼저, 우리는 aws의 Free Tier를 이용해서 인스턴스를 생성했다.
프리 티어는 신규고객에게 가입한 날로부터 12개월 동안 무료로 제공하는 일부 서비스를 뜻한다. 다양한 서비스가 존재하는데 EC2 프리티어는 t2.micro 인스턴스를 한달에 750시간 사용 가능하다! 웬만한 서버라면 과금없이 이용 가능할 것이다.
우분투 22.04버전을 이용해서 인스턴스를 생성해줬다. 인스턴스 생성이 완료됐다면 탄력적 IP라는 것을 발급받을 수 있는데,
탄력적 IP는 동적인 클라우드 컴퓨팅 시스템에서 고정된 정적인 IPv4 주소를 가지는 주소이다.
탄력적 IP를 발급받지 않고 그냥 사용하게 되면 기본적으로 제공해주는 퍼블릭 IP주소를 이용하게 되는데, 이는 인스턴스를 종료하고 재시작하면 변하게 되는 IP주소이다. 따라서 고정된 탄력적 IP를 발급받아서 인스턴스에 할당해줘야 한다. 탄력적 IP를 연결하는 방법은 마지막에 기록하고 먼저 인스턴스를 실행해서 프로젝트를 실행해보도록 하겠다.
★ 인스턴스 연결하기
인스턴스를 생성할 때 pem 키를 발급받을 수 있는데 pem 키가 저장되어있는 폴더로 이동해준다.
인스턴스를 누르고 상단을 보면 연결 버튼이 보이는데 들어가게되면 인스턴스에 연결할 수 있는 방법을 알려준다.
그중 나는 SSH 클라이언트를 이용해서 연결을 해줬다.
순서대로 그대로 적용을 해주면 되는데 제일 아래에 있는 ssh -i를 입력해주면 정상적으로 연결이 되는 것을 확인할 수 있다.
★ npm, node 설치하기
node를 실행시키기 위해선 npm과 node를 설치해줘야 한다.
sudo apt update
sudo apt install nodejs
sudo apt install npm
-v를 입력해 각각 제대로 설치가 완료되었는지 확인해본다. 해당 버전이 뜬다면 제대로 확인이 된 것!
npm -v
node -v
이제 git에 있는 프로젝트 파일을 clone해온 후, server.js에 연결 포트 번호를 수정해주면 대략적인 설정이 다 끝났다!
주소창에 IP를 치고 들어가게 되면 페이지가 떠야하는데 이상하게 접속을 허용할 수 없다고 뜬다.
이럴 때 확인해야할 부분은 보안 그룹!
★ 보안 그룹 설정하기
해당 인스턴스의 보안 그룹에 들어가보면 허용할 IP와 포트 번호를 지정할 수 있다. 아무것도 설정하지 않았다면 기본 22포트만 지정이 되어있을 건데 HTTP 80포트도 열어줘야 한다. 또한 나는 3000포트도 개방해서 접근을 허용해주려고 한다.
아웃바운드는 기본적으로 인바운드 규칙을 설정하면 그에 맞게 알아서 설정이 되고, 모든 포트에 개방이 되어 있을 것이다. 인바운드 규칙만 신경써서 수정해주면 된다. 22번 포트는 나만 접근할 것이므로 나의 IP로 설정을 해주었고 나머지는 모든 IP가 접근할 수 있도록 열어줬다.
이제 탄력적 IP와 pm2로 서버를 종료하더라도 node.js가 종료되지 않고 실행될 수 있도록 설정해보도록 하겠다.
★ 탄력적 IP 연결하기
좌측의 네트워크 및 보안 >> 탄력적 IP으로 들어가준다.
우측 상단의 탄력적 IP 주소 할당 버튼을 눌러준다.
기본으로 설정된 상태에서 우측 하단의 할당 버튼을 눌러주면 할당받기가 완료된다.
여기서부터가 중요한데 할당받은 IP를 인스턴스에 연결하지 않으면 과금이 발생할 수 있다!!
탄력적 IP 주소 연결을 눌러서 인스턴스를 연결해주면 된다.
★ pm2 설치
pm2란 터미널에서 인스턴스를 나오기 위해 서버를 꺼도 서버가 종료되지 않고 계속 돌아갈 수 있도록 도와주는 프로그램이다.
npm install -g pm2
해당 명령어를 이용해서 pm2를 설치해주고,
pm2 start "npm run dev" --name 원하는이름
를 이용해서 pm2를 실행시켜주면 정상적으로 서버가 실행되는 모습을 확인할 수 있다.
★ 힘들었던 점과 유의점
처음 제일 막막했던건 node.js에 대한 지식이 없었다는 부분이다. 비동기 통신을 사용하기 위해서 Node.js를 이용해 로직을 짰었는데, 해당 기능은 내가 구현한 기능이 아니였기에 막연한 두려움이 있었던 것 같다. 하나하나 코드를 들여다보면 어려운 부분이 없었기에 금방 로직을 이해하고 분석할 수 있었지만, 처음에 느껴지는 두려움이 있었던 것 같다. 또 힘들었던 점은 원래 https을 이용해서 stun 서버와 함께 배포를 했었으나, 무료 버전으로 배포를 진행하기에 스턴 서버까지 실행시키기에는 힘들다는 판단하에 https를 이용하지 않고 http만을 이용해서 서버를 배포했다. 그러나 프로젝트의 로직은 https를 이용했기에 수정해야할 부분이 많았고, 모든걸 터미널을 이용해서 해야하다보니 그 부분을 파악하고 고쳐나가는게 조금 힘들었던 것 같다. 스턴 서버를 사용하지 않다보니 실제 우리 프로젝트의 핵심이라고 볼 수 있는 실시간 화상이 되지 않아서 그 부분은 조금 아쉬웠다. 그래도 채팅 기능까지는 가능하도록 설정해놨으니 이정도로 만족해야하는 건가 싶다. 이번에 CI/CD의 중요성에 대해서 뼈저리게 느꼈다. 이후에 꼭 공부해서 사용을 해봐야할 것 같다고 생각했다.
그리고 아주아주 중요한 과금 부분에 대해서 다음에 같은 실수를 하지 않기 위해 기록하려고 한다.
서버 재배포를 마무리한 당일, 밤에 이런 메일이 날아왔다. 프리티어 알림 메일을 설정해놨는데, 해당 메일이 왔고 얼핏 봤을 때 85%의 사용량을 썼고 한 달 무료 사용량이 1시간이라고 되어있는 것 같아 두려운 마음에 인스턴스를 중지시켰다. 메일을 확인했을 때 밖이였기에 일단 인스턴스를 종료하고 다음날 어떻게 된건지 확인을 했는데 과금이 된 것이다..ㅠ 심지어 전날보다 비용이 더 늘어있었다.
어떻게 된건지 확인하기 위해 결제 서비스의 청구서를 들어가보니 세부사항을 확인할 수 있었는데 자세히 살펴보니 Elastic IP Addresses에서 요금이 발생한 것이다. 처음에 EC2만 보고 분명히 750시간이 무료라고 했는데 내가 뭔가 설정을 잘못한줄 알았다. 그런데 저걸 보고 아차 싶었다. 탄력적 IP에서 과금이 발생한 건데 위에서 말했던 것처럼 할당을 받고 인스턴스와 연결을 하지 않으면 과금이 된다고 알고있었는데 나는 연결만 하면 과금이 되지 않는 줄 알았다. 그런데 인스턴스에 연결을 해놓고 인스턴스를 중지시켜 놓아도 과금이 발생하는 거였다... 배포를 진행하면서 중간중간 인스턴스를 중지시킨 적이 있었는데 그게 1시간 정도가 돼서 메일이 날아왔었고, 그걸 본 나는 불안한 마음에 일단 하루 정도 인스턴스를 중지시켰었는데 그게 오히려 과금을 유발한 것이었다..ㅠㅠ
그래도 그렇게 큰 금액이 아니었고, 200원으로 탄력적 IP와 프리티어에 대해서 자세히 알게 되었으니 다행이라고 삼아야 할 것 같다🥲
혹시라도 이 글을 보시는 분들이 계시다면 저와 같은 실수는 하지 않으시길 바랍니다..
** 배포를 진행하면서 공부하고 알아봤던 내용이라 틀린 정보가 있을 수도 있습니다. 그런 부분은 알려주시면 좀 더 공부해서 수정하도록 하겠습니다!