배경 상황
- 개인 웹 프로젝트 배포 환경을 변경하려는 상황
- 리액트로 개발한 프론트 앱의 경우에는 S3, Cloudfront, Route53, ACM 등을 통해 도메인 연결 및 https 적용을 완료한 상황
- 노드로 개발한 백엔드 앱의 경우에는 Elastic Beanstalk 환경으로 배포하였고, Load Balancer와 ACM, Route53 을 사용하여 subdomain(api.blight-o.com) 연결 및 https 적용을 했었다.
- 하지만 한두달 사용해보니 Load Balancer 비용이 크게 발생한다는 것을 알게 되었다(EC2비용보다 큼. 달에 2~3만원).
- 현재 Load Balancer를 사용한 유일한 이유는 https 적용이었는데, 그래서 Load Balancer 없이 https를 적용할 방법을 찾아보기 시작했고, 여러가지 방법을 조사, 시도하다가 nginx를 사용하는 방법을 시도해보기로 했다.
- 참고로 https를 적용했어야 하는 이유는 다음과 같다.
- 우선 당연히 보안상 더 안전하다.
- 게다가 결정적으로 프론트의 경우 사용자 경험 측면에서 https가 필수라고 판단했다.
- 예를들어 크롬 브라우저에서는 https를 사용하지 않으면 UI 적으로 경고가 나타나기 때문에 사용자 입장에서 신뢰하기 어려운 느낌을 주기 때문이다.
- 백엔드의 경우, 사용자가 직접 접근할 일은 없기 때문에 굳이 https를 적용하고 싶지 않았으나(나중에 후순위로 적용해볼 생각이었음), 실제로 그렇게 해본 결과 프론트가 https인 경우 http인 api에 요청 시 에러가 발생한다는 것을 알게 되었다. 따라서 어쩔 수 없이 백엔드도 https를 적용해야 하는 상황이 된 것.
- 즉 비용상의 이유 때문에 Elastic Beanstalk(+Elastic Load Balancer) 대신 EC2+nginx를 사용하는 서버 환경으로 변경하려는 상황이다.
사용 기술 및 환경 요약
- 도메인 구입: namecheap.com
- DNS 설정: AWS Route 53
- 앱 백엔드 서버(WAS): node(express) 사용
- https 적용을 위한 reverse proxy 서버: nginx 사용
- SSL 인증서 발급: letsencrypt 사용
- 인증서 갱신 자동화: crontab 사용 예정
- 물리적 서버 컴퓨터: AWS EC2 - ubuntu 환경 인스턴스 사용
- 배포 환경: docker container를 사용
- (docker compose를 사용하여 node서버, certbot, nginx proxy 서버 - 요 세가지를 한번에 실행할 수 있도록 구성하였다)
주요 문제 요약 (처음 해보는 것들)
- EC2 서버 인스턴스 생성, 접속 및 ubuntu OS에서 필요환경 준비하기
- EC2 서버에서 node app 배포하기 (브라우저에서 IP주소로 접속했을때 api 응답 오는지 확인하기)
- Route53, namecheap 설정을 통해 (sub)domain 연결하기 (브라우저에서 api.blight-o.com 으로 접속했을때 api 응답 오는지 확인하기)
- nginx, letsencrypt(certbot) 사용하여 SSL 인증서 발급 및 https 적용하기
- 2, 3, 4를 docker를 사용하여 진행하기