Deployment

AWS를 이용한 배포 자동화

마손리 2023. 6. 26. 22:59

배포 자동화 파이프라인

배포에서 파이프라인(Pipeline)이란 용어는 소스 코드의 관리부터 실제 서비스로의 배포 과정을 연결하는 구조를 뜻한다. 파이프라인은 전체 배포 과정을 여러 단계(Stages)로 분리한다. 각 단계는 파이프라인 안에서 순차적으로 실행되며, 각 단계마다 주어진 작업(Actions)들을 수행한다.

파이프라인을 여러 단계로 분리할 때, 대표적으로 쓰이는 세 가지 단계가 존재한다. 

  1. Source 단계: Source 단계에서는 원격 저장소에 관리되고 있는 소스 코드에 변경 사항이 일어날 경우, 이를 감지하고 다음 단계로 전달하는 작업을 수행한다.
  2. Build 단계: Build 단계에서는 Source 단계에서 전달받은 코드를 컴파일, 빌드, 테스트하여 가공한다. 또한 Build 단계를 거쳐 생성된 결과물을 다음 단계로 전달하는 작업을 수행한다.
  3. Deploy 단계: Deploy 단계에서는 Build 단계로부터 전달받은 결과물을 실제 서비스에 반영하는 작업을 수행한다.

 

배포 자동화 구현

 

1. EC2 서버 셋업

$ sudo apt update

# JDK 설치
$ sudo apt install openjdk-11-jre-headless

# AWS CLI 설치
$ cd ~
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ sudo apt install unzip
$ unzip awscliv2.zip
$ sudo ./aws/install

# Code Deploy Agent 설치
$ cd ~
$ sudo apt update
$ sudo apt install ruby-full                # [Y / n] 선택 시 Y 입력
$ sudo apt install wget
$ cd /home/ubuntu
$ sudo wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
$ sudo chmod +x ./install
$ sudo ./install auto > /tmp/logfile

# Code Deploy Agent 실행 확인
$ sudo service codedeploy-agent status   // active(runnung)

위의 커맨드를 생성한 EC2 서버에 입력한다.

 

 

2. IAM role 생성 후 EC2에 접근 권한 부여

IAM role을 생성하여 위와 같이 어플리케이션 서비스에 맞는 IAM role들을 추가해준다. 배포 자동화에 사용될 CodeDeploy와 관련된 권한은 AmazonEC2RoleforAWSCodeDeployAWSCodeDeployRole이다.

 

이후 신뢰 정책을 편집해준다. 

 

위와 같이 role을 만들어준 뒤 EC2에 해당 role 부여

 

 

3. 로컬의 어플리케이션 서버에 설정파일 생성 및 배포자동화를 위한 설정

 

위와 같은 경로로 총 7개의 문서를 생성

 

  • synergy-project/server/appspec.yml
version: 0.0
os: linux

files:
  - source: /
    destination: /home/ubuntu/build  
#/home/ubuntu는 EC2서버의 기본 유저 directory이다.
#/home/ubuntu/build에는 빌드된 jar파일과 밑의 sh파일들이 위치할 예정이며 명시된 각 단계들마다 실행

hooks:
  BeforeInstall:
    - location: server_clear.sh
      timeout: 3000
      runas: root
  AfterInstall:
    - location: initialize.sh
      timeout: 3000
      runas: root
  ApplicationStart:
    - location: server_start.sh
      timeout: 3000
      runas: root
  ApplicationStop:
    - location: server_stop.sh
      timeout: 3000
      runas: root

 

  • synergy-project/server/buildspec.yml
version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto11
  build:
    commands:
      - echo Build Starting on `date`
      - cd server	# 해당 어플리케이션의 path에 맞게 명령어 설정
      - chmod +x ./gradlew
      - ./gradlew build
  post_build:
    commands:
      - echo $(basename ./server/build/libs/*.jar) # 해당 어플리케이션의 path에 맞게 명령어 설정
artifacts:
  files:  # 해당 어플리케이션의 path에 맞게 명령어 설정
    - server/build/libs/*.jar
    - server/scripts/**
    - server/appspec.yml
  discard-paths: yes

 

  • synergy-project/server/scripts/initialize.sh
#!/usr/bin/env bash
chmod +x /home/ubuntu/build/**

 

  • synergy-project/server/scripts/server_clear.sh
#!/usr/bin/env bash
rm -rf /home/ubuntu/build

 

  • synergy-project/server/scripts/server_start.sh
#!/usr/bin/env bash
cd /home/ubuntu/build
sudo nohup java -jar synergy_overflow-0.0.1-SNAPSHOT.jar > /dev/null 2> /dev/null < /dev/null &

 

  • synergy-project/server/scripts/server_stop.sh
#!/usr/bin/env bash
sudo pkill -f 'java -jar'

 

  • synergy-project/server/scripts/server_frontLog.sh
#!/usr/bin/env bash
sudo pkill -f 'java -jar'
java -jar synergy_overflow-0.0.1-SNAPSHOT.jar

 

4. AWS CodeDeploy 생성

 

CodeDeploy - Deploy - Applications - Create application으로 코드 디플로이 생성

 

 

Application 이름과 배포 서버의 플랫폼입력 후 생성

 

 

생성된 어플리케이션의 배포 그룹 생성

 

 

 

 

 

 

5. AWS CodePipeline 생성

 

 

 

 

 

  • Source stage

파이프라인에 해당 어플리케이션의 깃헙 리파지토리, 브랜치 연결

이후 Source stage 설정을 마친다.

 

 

  • Build stage

 

 

 

위에서 생성한 role 부여

 

위에서 생성한 buildspec.yml의 경로를 입력해 준뒤 Build stage 설정을 마처준다.

 

 

  • Deploy stage

Deploy stage를 마지막으로 CodePipeline 생성이 마무리된다.

 

 

6. 배포 자동화

CodePipeline을 마무리하면 위에서 설정한 대로 바로 배포를 진행한다.

 

배포에 실패한다면 아래와 같이 EC2 서버에서 로그를 확인하거나 CodePipeline에서 로그를 확인하여 고처준다.

 

 

 

'Deployment' 카테고리의 다른 글

AWS Parameter Store의 환경변수 EC2에서 연결하여 사용  (0) 2023.06.23