거누의 개발노트

Spring Boot - Github Action, S3, EC2, CodeDeploy 연동 본문

Spring

Spring Boot - Github Action, S3, EC2, CodeDeploy 연동

Gogozzi 2022. 6. 23. 17:31
반응형

Github Action을 이용해서 Spring Boot(Gradle) 웹 어플리케이션을 자동으로 빌드해주는 과적을 작성하려고 한다.

매번 build를 하고, 빌드된 jar파일을 EC2 서버에 접근해서 올리는 번거로운 작업이 사라지게 되어서 개발에만 집중할 수 있게 된다.

 

[S3 버킷 만들기]

이름만 정하고 나머지는 기본 설정값으로 만들기

[AWS IAM 사용자 만들기] - 권한추가하기

AmazonS3FullAccess
AWSCodeDeployFullAccess
AWSCodeDeployRole

권한 위에 3개 추가

키 잘 저장해 놓기

[AWS IAM 역할 만들기]

1. CodeDeploy 용 역할
AWSCodeDeployRole

2. EC2 용 역할

AmazonS3FullAccess
AWSCodeDeployFullAccess

 

2개 만들기 완료!

[ EC2 생성 / 설정]

우분투 서버 생성

보안 규칙 변경

IAM 역할 수정

위에서 만들었던 EC2용 역할 추가

EC2 인스턴스 식별을 위한 태그 추가

[AWS codeDeploy 만들기]

만든 애플리케이션의 배포 그룹 생성

IAM에서 codeDeploy용으로 만든 역할을 선택할 수 있다.

EC2, 인스턴스에서 만든 태그를 선택한다.

[내 EC2 접근 / 환경 설정]

Ubuntu Server용 CodeDeploy 에이전트 설치

sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent status

설치 완료

 

My Repository Settings -> Secrets -> Actions

저장해둔 AWS IAM 사용자 키 설정

Github Action 파일 생성

# This is a basic workflow to help you get started with Actions
name: Build and Deploy Spring Boot to AWS EC2

# main 브랜치에 푸쉬 했을때
on:
  push:
    branches: [ main ]

# 해당 코드에서 사용될 변수 설정
env:
  PROJECT_NAME: magazine
  BUCKET_NAME: geonoo-test
  CODE_DEPLOY_APP_NAME: codeDeploy-test
  DEPLOYMENT_GROUP_NAME: codeDeploy-test

jobs:
  build:
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        
      - name: Setup Java JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11
       
       ## gitignore한 파일 생성해주기
       ## create application.properties
      - name: make application-aws.properties
        if: true # branch가 develop일 때
        run: |
          # spring의 resources 경로로 이동
          cd ./src/main/resources
          touch ./application-aws.properties
          # GitHub-Actions에서 설정한 값을 application-dev.properties 파일에 쓰기
          echo "${{ secrets.PROPERTIES }}" > ./application-aws.properties
        shell: bash
		
        #gradlew 파일 실행권한 설정
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
        shell: bash
      
        #빌드 시작
      - name: Build with Gradle
        run: ./gradlew build
        shell: bash
        
        #프로젝트 zip파일로 압축
      - name: Make Zip File
        run: zip -qq -r ./$GITHUB_SHA.zip .
        shell: bash
      
        #aws 접근 id, key
      - 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: ap-northeast-2
      	
        # s3에 압축한 zip파일 업로드
      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
		
        # s3에 업로드한 파일 code Deploy에서 배포 요청
      - name: Code Deploy
        run: aws deploy create-deployment --application-name $CODE_DEPLOY_APP_NAME --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name $DEPLOYMENT_GROUP_NAME --s3-location bucket=$BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip

appspec.yml 

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

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

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

scripts라는 폴더 만들고 그안에 deploy.sh 파일 생성, 아래는 파일내용

#!/usr/bin/env bash

REPOSITORY=/home/ubuntu/magazine
cd $REPOSITORY

APP_NAME=cicd-test
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep 'SNAPSHOT.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME

CURRENT_PID=$(pgrep -f $APP_NAME)

if [ -z $CURRENT_PID ]
then
  echo "> 종료할것 없음."
else
  echo "> kill -9 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi

echo "> $JAR_PATH 배포"
nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &

위 처럼 만들어 놓는다.

 

 

반응형
Comments