[Spring] Github Action + AWS CodeDeploy를 이용하여 프로젝트 자동 배포하기

김진성·2022년 2월 21일
1

Spring

목록 보기
8/10

이번에 Spring 백엔드 프로젝트를 하는데 단순히 MVC Pattern을 적용해서 API를 만드는 것 이상으로 무엇인가를 하고 싶었다. 그것은 바로 Github Action과 AWS를 이용해 자동 통합 및 배포할 수 있는 CI/CD를 구축하는 것이다. Docker까지 같이 적용하고자 했으나 안써본 것들로 한번 해보면서 또 배움의 기회를 얻으려 하였다.

전체적인 순서

  1. Github으로 푸시를 하면 Github Action이 자동으로 실행된다.
  2. 그 과정에 jar, Shell Script 파일을 압축해서 S3로 업로드를 한다.
  3. EC2에 설치되어 있는 CodeDeploy가 S3에 업로드된 파일을 EC2로 가져와 배포를 진행한다.
  4. 작성한 Shell Script 파일을 통해 jar를 실행시켜 자동화 배포가 진행되는 것이다.

1. Github Actions 설정하기

  • 내 Repository-Action을 들어가면 내 프로젝트에 맞는 방식을 추천한다. 나는 java with Gradle로 진행하였다. 그러면 그 결과 아래와 같이 나오게 된다.

  • 여기서 중점적으로 나오는 부분은 name, run, shell로 실제 우리가 푸시를 할 때 실행되는 순서와 요소들이다.
name: cafein

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'temurin'
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    
    - name: Build with Gradle
      run: ./gradlew clean build

  • 그 결과 .github/workflows가 나타났음을 알 수 있다. 그리고 Actions에 다시 들어가면 잘 실행됨을 알 수 있다.

2. AWS S3에 빌드한 jar 업로드 하기

  • 먼저 Deploy를 위한 IAM 사용자를 등록해줘야 한다.

  • 여기서 중요한 것은 S3와 CodeDeploy로 이 2개만 있어도 된다.

  • 위처럼 권한 설정을 하고나면 ACCESS_KEY와 SECRET_ACCESS_KEY가 생기는데 이를 Github Settings에다가 등록해줘야 한다.

  • 위 요소에서 New Repository secret을 클릭해 아래의 3개를 적용한다.

  • 그런 다음에는 S3를 생성하고 환경 설정 부분에 새로 추가해줘야 한다. 나는 cafein-deploy라고 버킷을 만들었다.

  • 새롭게 gradle.yml을 수정해주고 push를 해준다.
name: cafein

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

env:
  S3_BUCKET_NAME: cafein-deploy

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'temurin'
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    
    - name: Build with Gradle
      run: ./gradlew clean build

    - name: Make zip file
      run: zip -r ./$GITHUB_SHA.zip .
      shell: bash

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ secrets.AWS_REGION }}

    - name: Upload to S3
      run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip
  • 그러면 새로운 Github Actions가 생성된다.

  • 그리고 S3에도 zip파일이 잘 업로드 된 것을 알 수 있다.

3. CodeDeploy 설치 및 설정하기

  • 앞서 본 것은 CI 과정으로 서버로 배포하는 것은 아니다. 이제 서버로 배포를 하는 CD과정을 거치려면 CodeDeploy를 사용해야 한다.

  • ec2 역할을 설정해줘야 하는데 실행하고자 하는 ec2 - 작업 - 보안 - IAM 역할 수정 - 새로운 역할 만들기에서 아래와 같은 역할을 생성하여 부여해야 한다. 그리고 재부팅 한다.

  • 역할 생성을 할 때 EC2를 연동한다.

  • S3와 CodeDeploy 사용

chmod 400 key이름.pem
ssh -i "key이름.pem" ubuntu@ip주소
  • 먼저 여기로 ubuntu 서버에 접속한 다음 CodeDeploy에 필요한 파일을 설치한다. 나는 AWS Ubuntu 서버로 실행하였다. EC2의 ubuntu 버전이 16.04 이상이므로 아래와 같이 진행했다.
sudo apt update
sudo apt install ruby-full
sudo apt install wget

cd /home/ubuntu

sudo apt install awscli
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2

chmod +x ./install
sudo ./install auto

# 이걸로 설치 확인을 할 수 있다.
sudo service codedeploy-agent status
  • 이제 CodeDeploy를 설정해줘야 한다. 여기서 Name-EC2 이름이고 중요한 것은 로드밸런싱을 해제해야 한다는 것이다.

4. 스크립트 추가하기

1) appspec.yml 설정

version: 0.0
os: linux
files:
  - source:  /
    destination: /home/ubuntu/action
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: ubuntu
    group: ubuntu

hooks:
  ApplicationStart:
    - location: scripts/deploy.sh
      timeout: 60
      runas: ubuntu

2) Github Actions yml 추가

- name: Code Deploy
  run: aws deploy create-deployment --application-name [만든 어플리케이션 이름] --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name [생성한 배포 그룹 이름] --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip

주의할 점 : Amazon Linux가 ubuntu인지 아닌지에 따라 appspec.yml 경로와 owner, group, runas가 ubuntu나 ec2-user로 구분이 되기에 사용하는 ec2 환경에서 사용자 계정 관리를 참고해야 한다.

5. 최종 확인

  • 일단 Github Actions에서도 내가 주문한 것들이 잘 실행됨을 알 수 있다.

  • 그리고 CodeDeploy 상에서도 잘 배포가 됨을 알 수 있다.

Spring 기반 Github Action 및 AWS를 연동하는 과정에서 자동배포를 하면서 Shell Script도 써보고 많이 배우게 되었다.

profile
https://medium.com/@jinsung1048 미디엄으로 이전하였습니다.

0개의 댓글