본문 바로가기

인프라/AWS

Github Action을 통한 스프링 AWS ec2 ci,cd 구축

AWS ec2서비스를 활용하여 spring배포, Route 53 서비스를 통한 DNS 서버 연동, 깃허브 액션을 통한 ci, cd 구축

전체 아키텍쳐

사용 기술

AWS ec2, GitHub Action, Spring, AWS Code Deploy

 

1. ec2 인스턴스 생성

2. 인스턴스에 JRE설치 및 CodeDeploy Agent 설치

ubuntu@ip-172-31-34-244:~$ sudo apt update
ubuntu@ip-172-31-34-244:~$ sudo apt install openjdk-17-jre-headless
ubuntu@ip-172-31-34-244:~$ java -version
openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment (build 17.0.6+10-Ubuntu-0ubuntu120.04.1)
OpenJDK 64-Bit Server VM (build 17.0.6+10-Ubuntu-0ubuntu120.04.1, mixed mode, sharing)

자신의 프로젝트에 맞는 자바 버전 설치

 

ubuntu@ip-172-31-34-244:~$ sudo apt install ruby-full
ubuntu@ip-172-31-34-244:~$ sudo apt install wget
ubuntu@ip-172-31-34-244:~$ wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
ubuntu@ip-172-31-34-244:~$ chmod +x ./install
ubuntu@ip-172-31-34-244:~$ sudo ./install auto
ubuntu@ip-172-31-34-244:~$ sudo service codedeploy-agent status
ubuntu@ip-172-31-34-244:~$ sudo service codedeploy-agent status
● codedeploy-agent.service - LSB: AWS CodeDeploy Host Agent
     Loaded: loaded (/etc/init.d/codedeploy-agent; generated)
     Active: active (running) since Fri 2023-07-09 01:19:51 UTC; 1min 1s ago	⇐ 정상적으로 동작되는 것을 확인
       Docs: man:systemd-sysv-generator(8)
      Tasks: 2 (limit: 1141)
     Memory: 59.7M
     CGroup: /system.slice/codedeploy-agent.service
             ├─6234 codedeploy-agent: master 6234
             └─6236 codedeploy-agent: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller of ma>

Mar 31 01:19:50 ip-172-31-34-244 systemd[1]: Starting LSB: AWS CodeDeploy Host Agent...
Mar 31 01:19:51 ip-172-31-34-244 codedeploy-agent[6224]: Starting codedeploy-agent:
Mar 31 01:19:51 ip-172-31-34-244 systemd[1]: Started LSB: AWS CodeDeploy Host Agent.

 

코드 디플로이 설치 및 설치 확인

3. ec2에서 s3 버킷에 저장된 코드를 가져올 수 있게 권한 부여

사용할 ec2 연결

 CodeDeploy Agent 재시작

ubuntu@ip-172-31-34-244:/opt/codedeploy-agent$ sudo service codedeploy-agent restart
ubuntu@ip-172-31-34-244:/opt/codedeploy-agent$ sudo service codedeploy-agent status

 

4. S3 버킷을 생성

5. CodeDeploy 애플리케이션 및 배포 그룹을 생성

6.Github Actions 설정

AmazonS3 FullAccess 및 AWSCodeDeployRole 추가

액세스키 추가

생성된 액세스 키 값과 비밀 액세스 키 값 저장

깃허브 설정 => Actions에 New repository secret

엑세스 키 값 추가

비밀 엑세스 키 값 추가

7.Github Actions 워크플로우를 작성

. github/workflows/deploy.yml 파일 작성

on:
  push:
    branches: [ "githubaction" ]     <= 자신의 브런치로 설정
env:
  AWS_REGION: ap-northeast-2
  S3_BUCKET_NAME: sihyun-webserver  <=  자신의 S3버킷으로 이름 변경

name: Deploy to Amazon EC2

on:			
  push:			
    branches: [ "githubaction" ]

env:			
  AWS_REGION: ap-northeast-2
  S3_BUCKET_NAME: sihyun-cicd-bucket
  CODE_DEPLOY_APPLICATION_NAME: my-codedeploy-app
  CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: my-codedeploy-deployment-group

permissions:		
  contents: read

jobs:			
  deploy:				
    name: Deploy			
    runs-on: ubuntu-latest	
    environment: production
    steps:
    - name: Checkout
      uses: actions/checkout@v3		

    - name: Set up JDK 17
      uses: actions/setup-java@v3	
      with:
        distribution: 'temurin'
        java-version: '17'
        cache: 'gradle'
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
      
    - name: Build with gradle 
      run: ./gradlew build --no-daemon -x test

    - 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: ${{ env.AWS_REGION }}
        
      
    - name: Upload to AWS S3
      run: |
        aws deploy push \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --ignore-hidden-files \
          --s3-location s3://${{env.S3_BUCKET_NAME}}/$GITHUB_SHA.zip \
          --source .

    - name: Deploy to AWS EC2 from S3
      run: |
        aws deploy create-deployment \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
          --s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip

8.scripts 작성

scripts/start.sh

#!/usr/bin/env bash

PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/bridge-0.0.1-SNAPSHOT.jar"

APP_LOG="$PROJECT_ROOT/application.log"
ERROR_LOG="$PROJECT_ROOT/error.log"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"

TIME_NOW=$(date +%c)

echo "$TIME_NOW : copy $JAR_FILE" >> $DEPLOY_LOG
cp $PROJECT_ROOT/build/libs/*.jar $PROJECT_ROOT

echo "$TIME_NOW : run $JAR_FILE" >> $DEPLOY_LOG
chmod 111 JAR_FILE
nohup java -jar $JAR_FILE > $APP_LOG 2> $ERROR_LOG &

CURRENT_PID=$(pgrep -f $JAR_FILE)
echo "$TIME_NOW : process id is $CURRENT_PID" >> $DEPLOY_LOG

scripts/stop.sh

#!/usr/bin/env bash

PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/bridge-0.0.1-SNAPSHOT.jar"

DEPLOY_LOG="$PROJECT_ROOT/deploy.log"

TIME_NOW=$(date +%c)

CURRENT_PID=$(pgrep -f $JAR_FILE)

if [ -z $CURRENT_PID ]; then
	echo "$TIME_NOW : no process" >> $DEPLOY_LOG
else
	echo "$TIME_NOW : stop PID $CURRENT_PID" >> $DEPLOY_LOG
	kill -15 $CURRENT_PID
fi

9. 배포 결과 확인

10. Route53 연동