블로그 개발기 - 배포편

네트워크 설정 및 배포 자동화

#Domain#Firewall#Network#ReverseProxy#SSL#TLS

코드 개발을 완료하고 막상 배포 하려니 적당한 무료 PaaS(Platform as a service) 서비스가 떠오르지 않았습니다. 무료 PaaS 키워드로 검색하니 수많은 서비스가 검색되고, 이를 모아둔 자료가 있어 공유합니다. 아래는 고려한 서비스 목록과 비교 내용입니다.

  • AWS

  • 서비스 스펙을 잘못 설정했는지는 모르겠으나, 실제 서비스를 설정하면 예상 요금이 유료로 책정됨

  • Heroku

  • 무료 플랜 폐지 예정이라고 함. 관련 기사

  • Vercel

  • 작은 프로젝트를 위한 무료 플랜 제공. NextJS 앱의 배포 및 CI/CD, HTTPS 등을 쉽게 사용할 수 있는 CLI를 제공함

  • Oracle Cloud

  • 일정 범위 내의 스펙, 사용량에 대한 무료 플랜 제공

유료 과금 가능성이 있는 AWS, Google, Heroku는 고려 대상에서 제외하였고, 최종적으로 고려한 서비스는 Oracle Cloud입니다. Vercel의 경우 명령어 하나면 배포가 가능할 만큼 편리한 서비스였지만, 직접 인프라를 구축하는 것이 목표였던 만큼 자동으로 구축하고 설정해주는 서비스는 최대한 배제하였습니다.

네트워크 구성

VCN(Virtual Cloud Network) 서비스는 Cloud 상에 사용자만의 가상 네트워크 영역을 생성합니다. 외부에서 접근할 수 있는 Public 영역과 네트워크 내부에서만 접근할 수 있는 Private 영역을 지정하였습니다.

Public 영역에는 서버를 설치할 Compute Instance(이하 인스턴스)를 배치하고, Private 영역에서는 Public 영역에 배치한 서버에서만 접근할 수 있는 Database를 배치하였습니다.

배포

배포는 인스턴스에 원격 Git 저장소를 생성하고 해당 저장소로 push 하면 해당 코드를 빌드하는 방식으로 진행하였습니다. 상세 진행 방식은 아래와 같습니다.

  • 새 코드 작성 ->

  • git commit ->

  • 인스턴스에 생성한 remote git repositorypush ->

  • git post-receive hook이 실행됨

(실행할 스크립트에 빌드 명령을 작성) ->

  • 빌드 및 서버 실행 ->

  • 배포 완료

HTTP, HTTPS 접근을 위한 네트워크 설정

Oracle Cloud(이하 오라클)VCN은 기본적으로 SSH 접속을 위한 22번 포트만 외부 접근이 허용되어 있습니다. 웹브라우저는 HTTP, HTTPS 프로토콜에 의한 접속이고, 이에 대한 기본 포트는 각각 80번, 443번에 할당되어 있으므로 서버 측 네트워크에서 해당 포트에 대한 데이터 수신을 허용해 주어야 합니다.

Oracle의 경우 인스턴스가 속해있는 네트워크의 Ingress Rules를 변경해주면 됩니다. 필요하다면 데이터 송출 규칙(Egress Rules)도 설정해야 합니다.

(Oracle의 기본 설정은 모두 허용이므로 생략)

OS 방화벽 허용 설정

네트워크에 웹 접근을 허용하면 네트워크 요청은 OS에 전달됩니다. 하지만 OS의 방화벽에서 이를 허용해주지 않으면 해당 요청은 내부 애플리케이션까지 전달되지 않습니다. 이 때문에 방화벽에 웹 포트를 허용하도록 등록해주어야 하며, Linux(이하 리눅스)의 경우 버전에 따라 설정 방법이 다를 수 있으니 현재 인스턴스에 설치된 OS 버전 확인이 필요합니다.

웹서버 설치 및 Proxy 설정

이제 모든 웹 요청은 80포트로 전달됩니다. 하지만 블로그 서버는 기본적으로 3000 포트에서 실행되기 때문에 80포트로 향하는 웹 요청을 블로그 서버는 수신할 수 없습니다. 이를 해결하기 위해서는 두 가지 방법이 있을 수 있습니다.

  • 하나는 블로그의 실행 포트를 80으로 변경하는 방법
  • 나머지 하나는 80포트의 요청을 3000포트로 전달하는 방법

저는 후자를 선택했습니다. 블로그 서버보다 앞선 단계에서 웹 요청을 제어하는 것이 이후에 무중단 배포 적용 등을 고려해보았을 때 유용할 수 있기 때문입니다. 후자와 같은 기법을 Reverse Proxy라고 합니다.

도메인 연결

구매한 도메인과 VCN을 연결하기 위해 도메인을 구매한 사이트에서 네임 서버를 현재 PaaS에서 제공하는 네임서버로 변경합니다. 네임 서버 변경 후 A 레코드값에 VCN의 공개 IP를 설정하여 도메인의 요청을 VCN으로 전달하도록 합니다.

(Oracle의 경우 DNS Management, AWS의 경우 Route53에서 설정할 수 있습니다.)

이때 VCN의 공개 IP가 동적으로 할당되어 변경될 가능성이 있는 경우 고정 IP를 할당 받아 입력합니다.

(Oracle의 경우 Reserved Public IPs, AWS의 경우 Elastic IP Addresses에서 할당할 수 있습니다.)

TLS 인증서 획득

도메인 연결까지 완료하면 도메인의 모든 요청이 블로그 서버로 전달되고, 도메인으로 페이지를 요청했을 때 블로그에 접속할 수 있어야 합니다. 하지만 몇몇 브라우저에서는 접속이 되지 않을 가능성이 있습니다. 최신 브라우저는 TLS(Transport Layer Security) 인증서를 획득한 사이트의 접속만 허용하는 기능이 있고, 현재 블로그는 TLS 인증서가 없으므로 보안을 위해 사이트 접속을 차단합니다.

TLS 인증서를 발급 받기 위해서는 인증 기관을 거쳐야 하고 대부분 유료로 진행됩니다. 하지만 Let's Encrypt에서 무료 TLS 인증서를 발급 받을 수 있습니다. 인증서 발급까지 완료하면 이제 도메인 주소 앞에 당당히 https를 붙일 수 있고 정상적으로 접속이 됩니다.

드디어

완성입니다.

https://jinsol.kim

참고


Profile picture

Jinsol Kim

Developer. Busan, South Korea.

#React #ReactNative #NextJS #iOS #Swift