Project Fake Search #5 배포 자동화 및 https 구현

안광의·2022년 1월 21일
0
post-thumbnail

시작하며

회고 블로깅의 마지막 파트로 배포에 관련된 글을 작성하지만 실제로 AWS에서 CodePipeline을 통해 자동화를 진행한 것은 프로젝트의 초반이었다. 프로젝트를 진행하면서 빌드나 배포 과정에서 문제가 발생할 수 있기 때문에 서버를 구현한 날 배포 자동화를 진행하게 되었다.

배포 자동화

클라이언트

//buildspec.yml
version: 0.2

phases:
  pre_build:
    commands:
      - cd client
      - npm install
  build:
    commands:
      - npm run build

artifacts:
  files:
    - "**/*"
  base-directory: client/build

AWS의 CodePipeline을 통해 깃헙 레포지토리에 변경사항이 생겼을 때 자동으로 빌드와 배포과정이 이루어지는데 정상적으로 빌드 과정이 진행될 수 있도록 빌드에 필요한 커맨드가 적혀있는 buildspec.yml 파일을 생성해주었다. 빌드가 정상적으로 완료되면 설정해둔 S3의 버킷에 빌드된 파일이 담기면서 배포가 완료되게 된다.


보안 상 깃헙 레포지토리에는 환경변수가 저장된 .env파일를 업로드하지 않기 때문에 Codebuild에서 클라이언트에서 사용하는 환경변수를 설정해주었다.

서버

EC2 초기 설정

서버는 클라이언트와 다르게 빌드 과정이 필요없지만 EC2에서 인스턴스를 생성해야하기 때문에 초반에 셋팅해주어야 하는 과정이 필요하다.

ec2에서 인스턴스를 생성한 후 접속해서 기본적으로 필요한 nvm, node, npm을 설치해주어야 하는데 npm install을 할 경우 Error: Missing required argument #1 에러가 발생하였다. 이전 프로젝트에서도 발생했던 에러로 npm version이 낮은 것이 원인이었다.

아래 명령어로 npm을 최신버전으로 업데이트 해줘서 추후 자동화 과정에서 발생할 에러를 방지해주었다.

$ npm cache clean --force
$ npm install -g n
$ n stable

추가로 서버에서 AWS의 Parameter Store의 환경변수를 가져오기 위해 아래 명령어로 AWS CLI를 설치해주었다.

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install

서버 배포 관련 파일 생성

//appspec.yml
version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/Fake-Search

hooks:
  ApplicationStop:
    - location: scripts/stop.sh
      runas: root
  AfterInstall:
    - location: scripts/initialize.sh
      runas: root
  ApplicationStart:
    - location: scripts/start.sh
      runas: root
//initialize.sh
#!/bin/bash
cd /home/ubuntu/Fake-Search/server
npm install
npm install pm2@latest -g
sudo apt-get update
sudo apt-get install authbind
sudo touch /etc/authbind/byport/80
sudo chown ubuntu /etc/authbind/byport/80
sudo chmod 755 /etc/authbind/byport/80
//start.sh
#!/bin/bash
cd /home/ubuntu/Fake-Search/server
...
(Parameter Store에서 환경변수를 가져오는 부분)
...
authbind --deep pm2 start index.js
//stop.sh
#!/bin/bash
cd /home/ubuntu/Fake-Search/server
pm2 stop index.js 2> /dev/null || true
pm2 delete index.js 2> /dev/null || true

처음 배포될때와 변경사항이 생겨서 파이프라인이 작동할때 정상적으로 서버가 재시작될 수 있도록 명령어가 정의된 파일을 생성해주었다.

백그라운드에서 서버 실행, 로그 관리, 재시작 등 편리한 기능을 제공하는 pm2를 사용하여 서버를 실행하기 위해서 80번 포트를 사용할 수 있도록 권한을 부여해주는 authbind와 관련된 명령어도 추가하였다.

RDS를 생성하고 Parameter Store에 환경변수를 설정해준후 클라이언트와 마찬가지고 파이프라인을 생성하여 자동화를 마쳤다.

https 구현

도메인 구입

https 구현을 위해 Route53에서 fakesearch.link라는 도메인을 구입하였다. 원래는 최상위 도메인을 com으로 하고 싶었지만 구매가 불가능하여 link로 구매하였는데, 검색해보니 Uniregistry라는 도메인 등록 대행업체가 만든 도메인이라고 한다. 한국에서는 생소한 도메인이지만 가격이 제일 저렴해서 구입하게 되었다.

이전에 다른 사이트에서 무료 도메인을 발급받아 배포를 진행한 적이 있었는데 Route53에서 직접 구입하면 별도로 DNS 설정을 해줄 필요가 없어서 편하다.

인증서 발급


AWS의 CM을 통해 https에서 사용되는 인증서를 발급받을 수 있는데 이번에 콘솔이 업데이트 되면서 리전을 설정할 수 있게 되었다. 이전에 인증서를 발급할 때는 us-east-1에서만 인증서 발급이 가능했던 걸로 기억해서 신경쓰지 않고 인증서를 발급받았는데, CloudFront에서 인증서 목록이 뜨지 않아서 확인해보니 리전이 서울로 설정되어있었다.

ec2는 서울에 생성되어 있어서 서버용 인증서는 문제가 없었지만 클라이언트 배포를 위한 CloudFront에서는 us-east-1에서 발급된 인증서만 사용이 가능하기 때문에 다시 발급해주었다.

로드 밸런서 생성

로드 밸런서는 원래 트래픽이 많을 때 여러 개의 인스턴스가 분산처리할 수 있도록 요청을 나누어주기 위해 사용하지만, 이번에는 https 요청을 리다이렉트 해주기 위해서 사용하였다.

CloudFront 배포 생성

s3는 리다이렉트 시 https를 지원하지 않기 때문에 CloudFront와 연결하여 배포를 생성해주었고 CNAMEs와 인증서를 선택해주었다.

Route53


마지막으로 도메인 구입 시 자동으로 생성된 Route53의 호스팅 영역에 로드밸런서와 CloudFront를 추가해주어 https 구현을 마쳤다.

마치며

그동안의 프로젝트에서도 같은 방식을 사용해서 배포했기 때문에 크게 어려움은 없었지만 다른 방식을 사용해보고 싶다는 생각이 들었다. Google Cloud Platform 같은 다른 플랫폼을 이용해보고 싶기도 하고 서버와 클라이언트(정적 웹호스팅)를 분리한 방식이 아닌 SSR 방식의 배포도 구현 해보고 싶다는 생각이 들었다. 관련해서 공부를 더 해보고 기회가 된다면 적절한 프로젝트에서 다른 방식을 구현해보고 싶다.

profile
개발자로 성장하기

0개의 댓글

관련 채용 정보