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 제거
'💠프로젝트 및 경험 > 프로젝트' 카테고리의 다른 글
[메모장 프로젝트] Nignx 무중단 배포 (AWS 5) (1) | 2025.07.18 |
---|---|
[메모장 프로젝트] 도메인 연결하기 (AWS 4) (0) | 2025.07.18 |
[메모장 프로젝트] RDS PostgreSQL 생성, EC2 에 Redis 설치 (AWS 2) (0) | 2025.07.18 |
[메모장 프로젝트] EC2 생성, 보안 그룹 설정 + 자동화 쉘 스크립트 (AWS 1) (0) | 2025.07.18 |
[모플 프로젝트] Vector Loki Grafana로 로그 수집 파이프라인 구축하기 !! (1) | 2025.06.14 |