[AWS] 스프링부트 프로젝트 배포하기
[ AWS ]2025. 5. 15. 10:012025.04.18

지난번에 ec2를 사용한 db 클라우드화를 진행했는데 이후 백엔드쪽 배포도 ec2를 사용해 진행하려고 하니 프리티어로는 버틸 수 없다는 결론이 나왔다. 그래서 두가지의 해결책을 찾았는데 첫번째는 인스턴스를 따로 생성해 스프링부트 배포용 인스턴스 한개, db배포용 인스턴스 한개를 사용하는 방법과 기존 ec2로 배포한 db서버를 rds로 마이그레이션을 진행하고, ec2를 스프링부트 배포용으로 사용하는 방법이였다. 고민 끝에 이 김에 rds도 사용해보는게 좋을 것 같다고 생각했고, 마이그레이션을 진행하였다.
마이그레이션을 마친 뒤 해야 할 일이 조금 남았는데 정리하자면
1. 도커설정
2. Github Actions 워크플로우 설정
3. EC2 환경설정
정도이다.
첫번째로 docker 설정을 해주었다.


도커파일은 자바21버전, OpenJDK중 가장 많이 쓰이는 eclipse-temurin을 사용해서 베이스 이미지를 작성해주었고, /tmp 디렉토리를 볼륨으로 마운트해서 build/libs 안의 jar 파일을 app.jar로 컨테이너에 복사하도록 설정해주었다. 관련 자료가 많았기에 큰 어려움은 없었다. docker-compose 같은 경우엔 추후 DB를 로컬에서 띄우는 경우나 redis 같은 부분을 함께 사용하고 싶을때 간편하다는 얘기가 있어 작성하게 되었고, 일단은 .env파일 사용하여 데이터를 넣는 식으로 진행했다.
2025.05.12
두번째로 자동배포를 위해 Github Actions 워크플로우 설정을 해주었다. deploy.yml로 설정해준 뒤, 설정에서 시크릿 키 몇개를 설정해주었다.

코드 자체는 아래처럼 작성하였다.
name: Docker Deploy to EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# 1. 코드 체크아웃
- name: Checkout code
uses: actions/checkout@v3
# 2. JDK 21 설치
- name: Set up JDK 21
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'temurin'
# 3. gradlew 실행 권한 부여
- name: Add execute permission to gradlew
run: chmod +x gradlew
# 4. Gradle build (테스트 제외)
- name: Build with Gradle
run: ./gradlew clean build -x test
# 5. Docker build
- name: Build Docker Image
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/moonrabbit-app:latest .
# 6. DockerHub 로그인
- name: Login to DockerHub
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
# 7. Docker 이미지 푸시
- name: Push Docker Image to DockerHub
run: |
docker push ${{ secrets.DOCKER_USERNAME }}/moonrabbit-app:latest
# 8. EC2용 pem 키 파일 생성
- name: Generate PEM key
run: |
echo "${{ secrets.EC2_PRIVATE_KEY }}" > private_key.pem
chmod 600 private_key.pem
# env 파일 생성
- name: Generate .env file
run: |
echo "${{ secrets.MOONRABBIT_ENV }}" > moonrabbit.env
# 8.5. EC2에 .env 전송
- name: Copy env file to EC2
run: |
scp -o StrictHostKeyChecking=no -i private_key.pem moonrabbit.env ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:~/moonrabbit.env
# 9. EC2에 SSH 접속 후 컨테이너 재시작
- name: Deploy on EC2
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << EOF
echo "DockerHub 로그인"
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
echo "기존 컨테이너 중지 및 삭제"
docker stop moonrabbit-app || true
docker rm moonrabbit-app || true
echo "Docker 이미지 Pull"
docker pull ${{ secrets.DOCKER_USERNAME }}/moonrabbit-app:latest
echo "컨테이너 실행"
docker run -d --name moonrabbit-app -p 8080:8080 \
--env-file moonrabbit.env \
${{ secrets.DOCKER_USERNAME }}/moonrabbit-app:latest
EOF
사실 백엔드 배포는 처음이였는데, Docker 관련 공부가 어려웠던 것 같고, 구조파악 하는데 시간을 오래 사용했던 것 같다. 추후엔 이런 이슈를 반복하지 않을 생각으로 주석도 열심히 달며 코드를 짠 기억이 있다.. (이 단계에서 3주정도 걸렸다,,)
어찌저찌 배포는 마치게 되었고, 이제 도메인 할당만 남았는데, 아마 추후에 진행할 듯 하다.

'[ AWS ]' 카테고리의 다른 글
| [AWS] EC2에 mysql 연결하기 (0) | 2025.03.28 |
|---|