Express 앱 AWS EC2에 자동배포(CI) 해보기

시작

토이프로젝트 작업 중에 Express 앱을 AWS EC2에 자동 배포해야할 일이 생겼다. 필자가 경험한 삽질을 최대한 녹여 글을 작성해보고자 한다.

준비

  • Express APP
  • 도메인이 연결된 EC2 (AWS한 서비스에 있는 Route 53 사용)
  • CircleCI 계정
  • ExpressApp source code가 존재하는 github repo

작업 순서

필자는 아래 순서로 자동 배포를 진행했다.

  1. CircleCI 를 통해 빌드 설정해보기
  2. 빌드 성공한 CircelCI 내역을 AWS EC2에 자동 배포하기

CI / CD

CI / CD 개념에 대해 간단히 익혀보자

  • Continuous Integration (CI) ⇒ 지속적 통합, 저장소에 코드를 제출하고 통합하는 과정이 반복되고 많아질 수록 코스트가 높아지게 되면서 이 해결책으로 등장한 개념, 수시로 저장소에 코드를 통합하는 과정 (빌드와 테스트)을 통해 저장소의 최신 상태를 유지
  • Continuous delivery (CD) ⇒ CI 를 통해 공유 저장소의 최신 상태를 유지하는 개념
  • Continuous deployment (CD) ⇒ 코드 변경 내역을 저장소에서 프로덕션 환경으로 자동 배포되는 개념

CircleCI 를 통해 빌드 & 테스트 설정해보기

이번 프로젝트에 앞서 TravisCI 를 통해 CI / CD 를 경험해본 적이 있다. 이번에는 설정이 보다 까다로운 설치형인 Jenkins을 통해 진행하려고 했다. 하지만 수많은 설정 / 서버 관리가 피로감을 누적시켰기에 구동 환경이 Cloud 인 CI/CD Tool 를 다시 선택하였다. youtube에서 열정적으로 광고 중이며 회사에서 CI 툴로 사용 중인 CircleCI 로 결정했다. 무료 정책도 토이 프로젝트 수준에서는 충분했다.

Jenkins에서 꽤나 손이 가던 github 연동 설정이 클릭 한번에 해결된다. Set up Project 설정과 동시에 샘플 config.yml 파일이 생긴다. 이 설정 파일을 통해 CircleCI 클라우드 컴퓨터에서 빌드와 테스트, 배포까지 진행하게 된다. github repo에 config.yml 파일 커밋해보자.

CircleCi 첫 연결시 볼 수 있는 샘플 config.yml

CircleCI config.yml 구성은 크게 다음과 같다.

  • command ⇒ jobs 아래 stpes 에서 호출되는 명령어 묶음 블락
  • executors ⇒ 빌드 환경을 설정하는 블락
  • jobs ⇒ CircleCI Pipeline 블락
  • workflow => 실제 job 들이 어떻게 동작할지에 대한 설정 블락

필자 환경에 맞는 간단한 빌드 & 테스트용 config.yml 파일을 작성해보자. config 파일 상세한 설정은 https://circleci.com/docs/2.0/concepts 에서 자세하게 설명되었으니 참고하면된다. 자신의 상황에 맞는 배포 설정 파일을 작성하면 된다. 배포 성공 목적의 간단한 설정만 해보았다.

version: 2.1

jobs:
  build:
    docker:
     - image: circleci/node:lts
     - image: circleci/mysql:5.7
       environment:
          MYSQL_USER=dbuser
          MYSQL_PASSWORD=dbpwd
          MYSQL_ALLOW_EMPTY_PASSWORD=false
          MYSQL_DATABASE=dbname
		# github repo에 server 하위 폴더에 서버 코드가 존재 
    working_directory: ~/project/server     
    steps:
			# github repo에 존재하는 소스 코드를 /project 하위에 checkout
      - checkout:
            path: ~/project
      - run: npm install  
			- run: npm test        

workflows:
  build_and_test:
    jobs:
      - build

해당 변경 사항을 github repo에 pull request 하면 CircleCI 에서 정상적으로 동작하는 것을 확인할 수 있다. 지금까지의 과정을 통해 CI 환경을 구성할 수 있다. 아래의 추가적인 작업을 통해 빌드를 통해 CD 환경까지 만족시켜보자.

Codedepoly로 AWS EC2에 자동 배포하기

AWS Codedeploy 기능은 이름에서 유추할 수 있듯이 다양한 컴퓨팅 서비스에 애플리케이션 배포를 자동화하는 서비스이다. CircleCI 빌드 성공한 어플리케이션을 AWS Codedepoly 를 통해 자동 배포해보자. 자동배포 FLOW는 다음과 같다.

  1. Github 특정 브런치(master)에 Merge가 됨
  2. CircleCI 에서 Github 이벤트를 감지하여 Workflows 설정에 맞는 build 와 deploy 실행 (CircleCI 와 CodeDeploy 설정)
  3. AWS codedeploy 실행 시 S3 bucket 에 어플리케이션 코드 저장 후 해당 파일을 EC2에 배포 (EC2에 AWS Codedeploy를 통해 배포하려면 Agent 설정 필요)
구현하게될 자동 배차 Flow

AWS Codedeploy 설정

  1. AWS > Codedeploy > 애플리케이션 생성 에서 컴퓨터 플랫폼 환경(EC2 / 온프레미스)에 맞게 어플리케이션을 생성한다.
  1. 다음은 배포 그룹을 설정하면 된다. 배포 그룹을 설정하기 전에 Codedeploy에 접근 가능한 IAM 권한(AWSCodeDeployRole)이 필요하다. IAM 에서 해당 권한을 생성하자.
  1. 이제 배포 그룹을 설정해주자. 배포 그룹 이름을 설정하고 서비스 역할에 방금 만든 IAM 를 설정한다. 또한 환경 구성으로 EC2 인스턴스의 key-value 를 설정해주자. Codedeploy가 해당 설정에 맞는 인스턴스를 찾아 배포를 진행할 것이다.
  1. AWS Codedeploy Agent 설치. CodeDeploy에서는 배포할 EC2 Codedeploy Agent 서비스가 실행 중이여야 정상적으로 동작한다. https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install.html 해당 링크를 참조해 배포 그룹의 key-value와 일치하는 인스턴스에 Agent 를 설치해주자. Agent 설치 후 EC2에 codedeploy Role 설정과 재부팅은 필수 사항이다.

CircleCI 와 AWS codedeploy 연결 설정을 위한 config.yml 파일 수정

CircleCI Orbs 는 반복되서 쓰이는 YAML 설정 재사용을 위해 패키지 형태로 제공해준다. 미리 설정된 패키지의 우리 환경에 맞는 값만 채워넣으면 된다. Orbs 패키지 중 aws-code-deploy를 참조해 config.yml 를 아래와 같이 수정한다.

version: 2.1

orbs:
  aws-code-deploy: circleci/aws-code-deploy@2.0.0
jobs:
  build:
    docker:
     - image: circleci/node:lts
     - image: circleci/mysql:5.7
       environment:
          MYSQL_USER=dbuser
          MYSQL_PASSWORD=dbpwd
          MYSQL_ALLOW_EMPTY_PASSWORD=false
          MYSQL_DATABASE=dbname
		# github repo에 server 하위 폴더에 서버 코드가 존재 
    working_directory: ~/project/server     
    steps:
			# github repo에 존재하는 소스 코드를 /project 하위에 checkout
      - checkout:
            path: ~/project
      - run: npm install  
			- run: npm test        

workflows:
  build_and_test:
    jobs:
      - build
	deploy_application:
    jobs:
      - aws-code-deploy/deploy:
          filters: # branch 가 master인 경우에만 배포를 진행한다.
            branches:
              only: master
          application-name: applicationName # AWS codedeploy NAME
          bundle-bucket: application-deploy # S3 bucket
          bundle-key: application-zip # S3 key
          deployment-group: application-deploy-group # AWS codedeploy 배포 그룹
          service-role-arn: application-deploy-role # AWS codedeploy IAM

해당 설정 파일을 github master 브랜치에 머지를 진행시켜보자. 브랜치가 master 인 경우에만 deploy가 정상적으로 수행되는 것을 볼 수 있다.

EC2 에 정상적으로 배포되었음을 확인해볼 수 있으며 AWS codedeploy 내역에서 배포 실행 내역을 확인해 볼 수 있다.

마무리

포스팅한 글에서는 간략하게 나와있지만 실제로 설정하면 여러가지 에러에 부딪힐 수 있을 것이다. 필자도 각종 사이트의 Document 참고하면서 설정을 해보았다. 필자의 글이 조금이라도 도움이 되었으면 좋겠다. 다음 포스팅은 AWS EC2 에 배포된 Express 앱의 http ⇒ https 로 redirect 하는 시도들에 대해 정리해보도록 하겠다. 읽어주셔서 감사합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다