[메모장 프로젝트] GitHub Actions 로 자동 배포 (AWS 3)

728x90

 

1. EC2 생성, 보안 그룹 설정 + 자동화 쉘 스크립트 

2. RDS PostgreSQL 생성, EC2 에 Redis 설치

3. GitHub Actions 로 자동 배포

4. 도메인 연결하기

5. Nignx 무중단 배포

 

자동 배포 구조

배포 방식

GitHub 의 애플리케이션 리포지토리에서

`main` 브렌치에 `push` 가 발생하면 자동으로 배포하도록 설정하였다.

 

그리고 배포를 할 때,

애플리케이션 리포지토리 자체를 `EC2` 서버로 전송하는 것이 아닌, `jar` 파일만 전송하여 

단순히 `EC2` 서버에서는 build 하지 않고, `jar` 파일을 실행하여 가볍게 돌아가도록 하였다.

 

GitHub Actions 로 자동 배포하기

EC2 java 설치

우선 `EC2` 서버에 `java` 와 `javac` 를 설치해야 한다.

 

ssh -i [key.pem] ubuntu@[EC2 퍼블릭 IP]

명령어를 통해 EC2 서버에 접속한다.

(이때, key.pem 파일이 있는 디렉토리로 이동 후 실행해야 한다.)

 

sudo apt update
sudo apt install openjdk-17-jre-headless -y
sudo apt install openjdk-21-jdk

`java` 와 `javac` 를 설치해 준다.

 

java -version
javac -version

명령어를 실행하고 올바른 버전이 나오면 성공이다!

 

GitHub Actions secrets

우선 GitHub 에서 배포할 레포지토리에 들어간다.

`Settings` > Secrests and Variables` > `Actions` 로 들어간 후,

 

`AWS_ACCESS_KEY_ID` : 발급받았던 `aws_access_key_id`

`AWS_SECRET_ACCESS_KEY` : 발급받았던 `aws_secret_access_key`

`EC2_HOST` : `EC2` 인스턴스 퍼블릭 IP or 도메인

`EC2_SSH_KEY` : `.pem` 의 키 페어 파일 내용

`EC2_USERNAME` : Ubuntu 면 기본값 `ubuntu`

 

비밀 변수를 넣어준다. 그리고 `deploy.yml` 에 해당 값들을 변수로 사용하여 스크립트를 작성할 것이다.

 

GitHub Action Deply.yml

name: Notepad EC2 Deploy

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    env:
      RELEASE_DIR: "/home/ubuntu/memo-notepad/releases"
      DEPLOY_PATH: "/home/ubuntu/memo-notepad/deploy.sh"

    steps:
      # 1. 소스코드 체크아웃
      - name: Checkout source
        uses: actions/checkout@v3

      # 2. JDK 17 설치
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      # 3. gradlew 실행 권한 부여
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew

      # 4. 빌드 (테스트 제외)
      - name: Build with Gradle
        run: ./gradlew clean build -x test

      # 5. JAR 이름 설정
      - name: Set JAR_NAME with timestamp
        run: echo "JAR_NAME=notepad-$(date +'%Y%m%d%H%M%S').jar" >> $GITHUB_ENV

      # 6. JAR 파일 이름 수정
      - name: Rename JAR
        run: mv build/libs/notepad-0.0.1-SNAPSHOT.jar build/libs/${{ env.JAR_NAME }}

      # 7. GitHub Actions 퍼블릭 IP 획득
      - name: Get GitHub Actions IP
        id: ip
        uses: haythem/public-ip@v1.2

      # 8. AWS 설정
      - name: Configure AWS
        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

      # 9. EC2 보안 그룹에 SSH 허용 (임시)
      - name: Add IP to Security Group
        run: |
          aws ec2 authorize-security-group-ingress \
            --group-name notepad-secure \
            --protocol tcp \
            --port 22 \
            --cidr ${{ steps.ip.outputs.ipv4 }}/32

      # 10. 빌드된 JAR 파일 EC2로 전송
      - name: Copy JAR to EC2
        uses: appleboy/scp-action@v0.1.7
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USERNAME }}
          key: ${{ secrets.EC2_SSH_KEY }}
          source: "build/libs/${{ env.JAR_NAME }}"
          target: "${{ env.RELEASE_DIR }}"
          strip_components: 2

      # 11. EC2에서 애플리케이션 재시작
      - name: Restart App on EC2
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USERNAME }}
          key: ${{ secrets.EC2_SSH_KEY }}
          script: |
            cd ${{ env.RELEASE_DIR }}
            LATEST_JAR=$(ls -1tr *.jar | tail -n 1)
            ${{ env.DEPLOY_PATH }} $LATEST_JAR

      # 12. SSH 허용 IP 제거 (보안)
      - name: Remove IP from Security Group
        if: always()
        run: |
          aws ec2 revoke-security-group-ingress \
            --group-name notepad-secure \
            --protocol tcp \
            --port 22 \
            --cidr ${{ steps.ip.outputs.ipv4 }}/32

`ssh` `22` 포트는 내 ip 만 허용되어 있다.

따라서 Github Action 에서 자동 배포를 진행할 때, 허용되지 않은 ip 라 `EC2` 서버에 접근을 할 수가 없는 문제가 발생한다.

 

Github Action 의 퍼블릭 Ip 를 가져와 임시로 `EC2` 보안 그룹에 추가하고, 배포한 뒤에 보안 그룹에서 자동 삭제해 주는 방식을 적용하였다.

 

1. 소스 코드 체크 아웃

  : 깃허브 저장소에서 최신 코드 가져오기

2. JDK 17 설치

  : GitHub Actions 실행 환경에 JDK 17 세팅

3. Gradlew 권한 설정 및 빌드 실행

  : 테스트 제외 프로젝트 빌드

  : Jar 파일 생성

4. Jar 파일 이름에 타임스탬프 붙여서 변경

  : 빌드된 Jar 파일 이름을 `notepad-20250718123000.jar` 형식으로 변경

5. GitHub Actions 퍼블릭 IP 가져와서 EC2 보안 그룹에 임시 허용

  : IP 기반으로 `SSH` 접근 허용

6. Jar 파일을 EC2 특정 디렉토리로 전송

7. EC2 에서 최신 JAR 파일을 찾아서 `deploy.sh` 스크립트 실행하여 애플리케이션 재시작

8. EC2 보안 그룹에서 SSH 허용한 IP 제거

 

 

 

 

 

 

 

 

 

 

728x90