[AWS] GitHub Actions와 EC2를 활용한 배포 자동화

KWAK-JINHO·2025년 2월 17일
post-thumbnail

설날 내내 aws를 붙잡고 싸운 내용을 정리해보겠다😭
배포 자동화를 구축하는 방법에는 Jenkins, GitHub Actions 등 다양한 도구가 있지만 GitHub Actions는 GitHub에 내장되어 있으며 유지보수가 필요없고 간단한 배포 자동화를 경험해보기에 좋을 것 같아 선택하였다.

빌드 및 실행 준비

./gradlew build
./gradlew build -x test # 테스트 제외 빌드
  • build/libs 하위에 .jar 파일 생성됨
  • --plain.jar: 라이브러리 용도 (실행 불가)
  • 일반 .jar: 실행 가능한 독립형

실행 명령어

java -jar -Dspring.profiles.active=prod app.jar

EC2 인스턴스 생성

  • Amazon Linux 2 + t2.micro (프리티어)
  • 키페어 생성 (.pem)
  • VPC 및 보안 그룹 구성
  • 포트: 22(SSH), 80(HTTP), 3306(MySQL) 오픈

EC2 접속 및 전송

SSH 접속

ssh -i ~/.ssh/key.pem ec2-user@<EC2 퍼블릭 IP>

SCP로 파일 전송

scp -i ~/.ssh/key.pem app.jar ec2-user@<IP>:~/deploy/

Java 설치 및 애플리케이션 실행

Amazon Corretto 21를 설치했다.

curl -LO https://corretto.aws/downloads/latest/amazon-corretto-21-x64-linux-jdk.rpm
sudo yum localinstall -y amazon-corretto-21-x64-linux-jdk.rpm

애플리케이션 실행

nohup java -jar -Dspring.profiles.active=prod app.jar &
tail -f nohup.out
  • ps aux | grep java: 실행 확인
  • kill -9 <pid>: 종료

MySQL 설치 및 설정

  • Amazon Linux에 MySQL 8.0 설치 시 이슈 → 2023 버전 설치로 해결
  • ALTER USER 'root'@'localhost' IDENTIFIED BY 'your-password';
  • 인바운드 규칙 3306 포트 추가

.yml 파일 관리

  • --spring.profiles.active로 환경 분리 (local, prod)
  • 서버 환경에서는 DB 주소를 localhost로 설정

민감 정보 관리 방법

방법 1: git secret 사용

  • .yml 파일은 .gitignore 처리
  • 팀원 GPG 키 등록 → 공유 가능

방법 2: yml 파일을 별도 private repo에 분리

  • 파일 단위 관리 편리

워크플로우 작성

name: CI/CD Pipeline

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Set up Java
        uses: actions/setup-java@v3
        with:
          distribution: 'corretto'
          java-version: '21'

      - name: Build with Gradle
        run: ./gradlew clean build

  deploy:
    needs: build
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Set up SSH key
        uses: webfactory/ssh-agent@v0.5.4
        with:
          ssh-private-key: ${{ secrets.EC2_SSH_KEY }}

      - name: Add known hosts
        run: ssh-keyscan -H ${{ secrets.EC2_HOST }} >> ~/.ssh/known_hosts

      - name: Deploy
        run: |
          rsync -avz ./build/libs/app.jar ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:${{ secrets.EC2_DEPLOY_PATH }}
          ssh ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << EOF
            pkill -f app.jar || true
            sleep 5
            nohup java -jar app.jar > nohup.out 2>&1 &
          EOF

유틸 명령어

  • nohup: 백그라운드 실행 유지
  • tail -f nohup.out: 로그 실시간 확인
  • netstat -tulnp: 포트 점유 상태 확인
  • ps aux | grep <키워드>: 실행 중 프로세스 찾기
profile
매일 더 나은 내가 되자

0개의 댓글