
배포 자동화는 프로젝트 초반에 미리 구현했던 부분인데 도메인 구입과 https 적용에 맞추어 한번에 포스팅하였다. https 구현은 다가치에도 진행했던 부분이지만 배포 자동화를 프로젝트에 적용하는 것은 처음이였는데, 배포와 관련된 모든 부분은 AWS를 사용하여 진행하였다.
이전 프로젝트에서는 freenom(https://www.freenom.com)이라는 사이트에서 무료 도메인을 받아서 사용하였는데 이번 프로젝트는 Route53에서 구입하였다. 다행히 slow-postbox.com 이라는 도메인을 사용할 수 있어서 세금 포함하여 15,000원 정도의 금액으로 구입하였다.
AWS의 Certification Manager에서 인증서를 발급 받기 위해서는 DNS 인증을 거쳐야 하는데 Route 53에서 도메인을 구입할 경우, 별도의 설정 없이 인증이 가능해서 편리했다.

배포 자동화를 위해 Github 레포지터리와 CodePipeline를 연결하였는데 서버와 클라이언트 총 2개의 파이프라인을 생성하였다. 클라이언트의 경우 S3의 버킷의 정적 웹호스팅으로 배포가 이루어지기 때문에 build 과정을 거쳐서 세 단계로 배포가 이루어지고 서버는 별도의 빌드 과정없이 ec2를 사용하여 배포가 이루어진다.

최상단 폴더에 buildspec.yml 파일을 생성하여 배포 자동화 과정에서 빌드가 이루어 질수 있도록 명령어들을 설정해주었다.
//buildspec.yml
version: 0.2
phases:
  pre_build:
    commands:
      - cd client
      - npm install
  build:
    commands:
      - npm run build
artifacts:
  files:
    - '**/*'
  base-directory: client/build

ec2에 접속하여 배포에 필요한 node.js, nvm, npm을 설치하고 Github 레포지터리에 아래 파일들을 추가하여 정상적으로 배포 자동화가 이루어 질 수 있도록 설정해주었다.
Parameter Store에 데이터베이스나 nodemailer에 사용하는 계정, jwt의 secret과 같은 환경변수들을 추가하였다.
//appspec.yml
version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/slow-postbox
hooks:
  ApplicationStop:
    - location: scripts/stop.sh
      runas: root
  AfterInstall:
    - location: scripts/initialize.sh
      runas: root
  ApplicationStart:
    - location: scripts/start.sh
      runas: root
//scripts/initialize.sh
#!/bin/bash
cd /home/ubuntu/slow-postbox/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
//scripts/start.sh
#!/bin/bash
cd /home/ubuntu/slow-postbox/server
export DATABASE_USER=$(aws ssm get-parameters --region ap-northeast-2 --names DATABASE_USER --query Parameters[0].Value | sed 's/"//g')
export DATABASE_PASSWORD=$(aws ssm get-parameters --region ap-northeast-2 --names DATABASE_PASSWORD --query Parameters[0].Value | sed 's/"//g')
export DATABASE_HOST=$(aws ssm get-parameters --region ap-northeast-2 --names DATABASE_HOST --query Parameters[0].Value | sed 's/"//g')
export DATABASE_NAME=$(aws ssm get-parameters --region ap-northeast-2 --names DATABASE_NAME --query Parameters[0].Value | sed 's/"//g')
export ACCESS_SECRET=$(aws ssm get-parameters --region ap-northeast-2 --names ACCESS_SECRET --query Parameters[0].Value | sed 's/"//g')
export ACCOUNT_USER=$(aws ssm get-parameters --region ap-northeast-2 --names ACCOUNT_USER --query Parameters[0].Value | sed 's/"//g')
export ACCOUNT_PASS=$(aws ssm get-parameters --region ap-northeast-2 --names ACCOUNT_PASS --query Parameters[0].Value | sed 's/"//g')
authbind --deep pm2 start index.js
//scripts/stop.sh
#!/bin/bash
cd /home/ubuntu/slow-postbox/server
pm2 stop index.js 2> /dev/null || true
pm2 delete index.js 2> /dev/null || true

S3와 클라이언트를 연결하는 이유는 첫번째로 로그인 시, accessToken을 쿠키에 담아야 하는데 S3는 쿠키를 담을 수 없기 때문이고 두번째는 보안을 위해 https를 적용하기 위해서이다.
CM에서 https 적용에 필요한 인증서를 발급받아서 S3와 클라이언트를 연결해주었다. 이전에 인증서를 CloudFront에서 선택하는 과정에서 목록에 표시되지 않아서 애먹은적이 있었는데 같은 내용으로 인증서를 한번 더 발급했더니 바로 표시되었다.


보통 로드 밸런서를 생성해주는 이유는 서버에 오는 요청을 여러 EC2로 분산 처리하기 위해서로 알고 있는데 그 정도의 규모가 있는 프로젝트가 아니기 때문에 https를 적용하기 위한 이유로 로드 밸런서를 생성하였다.

마지막으로 Route 53에서 CloudFront에 생성한 배포(클라이언트)와 로드 밸런서(서버)를 도메인과 연결하는 과정을 통해 배포를 마무리하였다.

이전 프로젝트에서 처음 배포를 하면서 애먹은 부분이 많았는데 확실히 두번째여서 크게 어려움 없이 배포를 마칠 수 있었다. 이번에는 파이프라인 생성을 통해 자동화 과정까지 진행해서 바로 수정된 부분이 반영되어서 편하게 진행할 수 있었다.