시작
토이프로젝트 작업 중에 Express 앱을 AWS EC2에 자동 배포해야할 일이 생겼다. 필자가 경험한 삽질을 최대한 녹여 글을 작성해보고자 한다.
준비
- Express APP
- 도메인이 연결된 EC2 (AWS한 서비스에 있는 Route 53 사용)
- CircleCI 계정
- ExpressApp source code가 존재하는 github repo
작업 순서
필자는 아래 순서로 자동 배포를 진행했다.
- CircleCI 를 통해 빌드 설정해보기
- 빌드 성공한 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 구성은 크게 다음과 같다.
- 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는 다음과 같다.
- Github 특정 브런치(master)에 Merge가 됨
- CircleCI 에서 Github 이벤트를 감지하여 Workflows 설정에 맞는 build 와 deploy 실행 (CircleCI 와 CodeDeploy 설정)
- AWS codedeploy 실행 시 S3 bucket 에 어플리케이션 코드 저장 후 해당 파일을 EC2에 배포 (EC2에 AWS Codedeploy를 통해 배포하려면 Agent 설정 필요)

AWS Codedeploy 설정
- AWS > Codedeploy > 애플리케이션 생성 에서 컴퓨터 플랫폼 환경(EC2 / 온프레미스)에 맞게 어플리케이션을 생성한다.

- 다음은 배포 그룹을 설정하면 된다. 배포 그룹을 설정하기 전에 Codedeploy에 접근 가능한 IAM 권한(AWSCodeDeployRole)이 필요하다. IAM 에서 해당 권한을 생성하자.

- 이제 배포 그룹을 설정해주자. 배포 그룹 이름을 설정하고 서비스 역할에 방금 만든 IAM 를 설정한다. 또한 환경 구성으로 EC2 인스턴스의 key-value 를 설정해주자. Codedeploy가 해당 설정에 맞는 인스턴스를 찾아 배포를 진행할 것이다.

- 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 하는 시도들에 대해 정리해보도록 하겠다. 읽어주셔서 감사합니다.