Github로 AWS EC2에 Spring-boot 프로젝트 배포하기

배한샘·2023년 12월 1일
0

목표

CICD 자동화 구현을 통해 Spring-boot 프로젝트 배포

배포 프로세스

  1. 로컬에서 Github로 코드 Push
  2. Github Action에서 Push 이벤트를 캐치해 Workflow 실행
  3. Workflow에서 S3로 프로젝트 업로드 및 CodeDeploy로 배포 요청
  4. CodeDeploy에서 S3에서 받은 프로젝트를 EC2로 배포

개요

  1. IAM 계정 생성 및 권한 부여
  2. IAM 계정 키페어 발급 및 Github에 입력
  3. IAM 계정에 역할 생성
  4. AWS EC2 세팅
    1) EC2 인스턴스 생성
    2) 보안그룹 설정
    3) EIP 생성 및 연결
    4) IAM 역할 연결
    5) 윈도우 터미널에서 ssh로 EC2에 접속
    6) CodeDeploy agent 설치
    7) Java 설치
  5. AWS S3 세팅
  6. AWS CodeDeploy 세팅
  7. Github Actions 세팅
  8. 배포 후 실행할 스크립트 작성
    1) appspec.yml 작성
    2) 실행 스크립트 작성
  9. 배포 진행
  10. 트러블 슈팅
    참고

1. IAM 계정 생성 및 권한 부여

2. IAM 계정 키페어 발급 및 Github에 입력


3. IAM 계정에 역할 생성

4. AWS EC2 세팅

1) EC2 인스턴스 생성

2) 보안그룹 설정

3) EIP 생성 및 연결


EC2 인스턴스 생성시에는 외부 도메인에서 접근할 수 있는 IP 주소가 할당되어 있지 않다. EIP(탄력적 IP, 고정 IP)를 생성해 EC2 인스턴스와 연결해 주면 해당 IP를 통해 외부 도메인에서 EC2에 접근할 수 있다.

4) IAM 역할 연결

5) 윈도우 터미널에서 ssh로 EC2에 접속

  • 아래 링크에서 윈도우 터미널 설치
    https://learn.microsoft.com/ko-kr/windows/terminal/install

  • EC2 키페어 생성

  • Home 디렉토리에 .ssh폴더 만들고 PEM파일과 Config파일 넣기

    (Home 디렉토리 찾는 방법 : 윈도우 터미널에서 cd ~ 명령어 입력)

  • Config 파일에 EC2에 접속하기 위한 정보 입력

  • 윈도우 터미널에서 SSH 명령어로 EC2에 접속

6) CodeDeploy agent 설치

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 > /tmp/logfile

7) Java 설치

sudo apt update
sudo apt install openjdk-17-jdk

5. AWS S3 세팅

6. AWS CodeDeploy 세팅


7. Github Actions 세팅


Workflow 작성

name: CICD Test
run-name: Running
on:
  push:
    branches:
      - master

env:
  AWS_REGION: ap-northeast-2
  AWS_S3_BUCKET: hellospringbucket
  AWS_CODE_DEPLOY_APPLICATION: cicd-test-CD
  AWS_CODE_DEPLOY_GROUP: cicd-test-CD-group

jobs:
  build-with-gradle:
    runs-on: ubuntu-20.04
    steps:
    - name: master 브랜치로 이동
      uses: actions/checkout@v3
      with:
        ref: master
    - name: JDK 17 설치
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'corretto'
    - name: gradlew에 실행 권한 부여
      run: chmod +x ./gradlew
    - name: 프로젝트 빌드
      run: ./gradlew clean build -x test
    - name: AWS credential 설정
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-region: ${{ env.AWS_REGION }}
        aws-access-key-id: ${{ secrets.CICD_ACCESS_KEY }}
        aws-secret-access-key: ${{ secrets.CICD_SECRET_KEY }}
    - name: S3에 업로드
      run: aws deploy push --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --ignore-hidden-files --s3-location s3://$AWS_S3_BUCKET/cicdtest/$GITHUB_SHA.zip --source .
    - name: EC2에 배포
      run: aws deploy create-deployment --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.AWS_CODE_DEPLOY_GROUP }} --s3-location bucket=$AWS_S3_BUCKET,key=cicdtest/$GITHUB_SHA.zip,bundleType=zip

8. 배포 후 실행할 스크립트 작성

1) appspec.yml 작성

프로젝트의 루트 경로에 appspec.yml 작성
배포 위치와 배포 과정에서 실행할 스크립트 정보를 기입한다

version: 0.0
os: linux

files:
  - source:  /
    destination: /home/ubuntu/SpringCore-Extention
    overwrite: yes

permissions:
  - object: /
    owner: ubuntu
    group: ubuntu

hooks:
  AfterInstall:
    - location: scripts/stop.sh
      timeout: 60
  ApplicationStart:
    - location: scripts/start.sh
      timeout: 60

2) 실행 스크립트 작성

  • stop.sh : Spring-boot 프로젝트가 EC2로 복사된 후 실행
#!/bin/bash

ROOT_PATH="/home/ubuntu/SpringCore-Extention"
JAR="$ROOT_PATH/application.jar"
STOP_LOG="$ROOT_PATH/stop.log"
SERVICE_PID=$(pgrep -f $JAR) # 실행중인 Spring 서버의 PID

if [ -z "$SERVICE_PID" ]; then
  echo "서비스 NouFound" >> $STOP_LOG
else
  echo "서비스 종료 " >> $STOP_LOG
  kill "$SERVICE_PID"
  # kill -9 $SERVICE_PID # 강제 종료를 하고 싶다면 이 명령어 사용
fi
  • start.sh : 애플리케이션 (재)실행 시점에 실행
#!/bin/bash

ROOT_PATH="/home/ubuntu/SpringCore-Extention"
JAR="$ROOT_PATH/application.jar"

APP_LOG="$ROOT_PATH/application.log"
ERROR_LOG="$ROOT_PATH/error.log"
START_LOG="$ROOT_PATH/start.log"

NOW=$(date +%c)

echo "[$NOW] $JAR 복사" >> $START_LOG
cp $ROOT_PATH/build/libs/application.jar $JAR

echo "[$NOW] > $JAR 실행" >> $START_LOG
nohup java -jar $JAR > $APP_LOG 2> $ERROR_LOG &

SERVICE_PID=$(pgrep -f $JAR)
echo "[$NOW] > 서비스 PID: $SERVICE_PID" >> $START_LOG

9. 배포 진행

Github로 커밋을 push하면 배포가 진행된다



EC2에 Spring-boot 전송 및 jar파일 생성된 것 확인

접속 확인

10. 트러블 슈팅

1) S3 업로드 과정에서 오류

  • 오류원인

  • 오류해결
    오표기된 Code Deploy Application 수정

2) CodeDeploy에서 EC2로 배포 중 오류

  • 오류원인

    codedeploy-agent에 해당 역할을 수행할 IAM 자격증명이 존재하지 않기 때문에 발생. EC2에 역할 연결을 하기 전에 codedeploy-agent를 세팅했기 때문에 발생한 문제.

  • 오류해결

sudo service codedeploy-agent restart

codedeploy-agent 재시작

3) EC2에 프로젝트 전송 후 LifecycleEvent에서 스크립트 실행 중 오류

  • 오류원인

    디렉토리 및 jar파일명 오표기로 인한 오류

  • 오류해결

참고

블로그 링크

profile
Back-End Engineer

0개의 댓글