-
Notifications
You must be signed in to change notification settings - Fork 3
AWS EC2 docker compose Redis Spring boot RDS S3 로 배포하기 정리편
AWS 에서 제공하는 가상의 서버 인스턴스를 EC2라 한다. 프리티어 기준으로 생성해서 실습을 진행하면 된다. 구글에 검색했을 때, 나오는 예제를 따라해서 진행하면 된다. -> 이 프로젝트에서 참고한 블로그는 [issue] 탭에서 환경 세팅 포스트를 참고하길 바란다. 프리티어 계정 기준, 탄력적 IP 1개가 무료이기 때문에 설정해서 사용하길 권장한다. ( 단, IP를 할당 받고 서버와 연결하지 않으면 과금이 발생하니 주의해야 한다. )
디비 서버로 사용했다. 이것 역시 프리티어 기준으로 생성해서 실습을 진행하면 된다. MySQL로 선택해서 진행했다. 인스턴스 자동으로 연결하지 말고 따로 보안 그룹 통해서 연결하길 권장한다.
-> application-secret.yml 파일 내에 URL과 USER, PW를 정의해주는 것 외엔 별도의 설정이 필요하지 않다.
스토리지 용도로 사용했다. -> 이미지 저장용으로 가장 많이 사용했다.
-> application-secret.yml 파일 내에 버킷명, ACCESS-KEY, SECRET-KEY 를 정의해주는 것 외엔 별도의 설정이 필요하지 않다.
AWS EC2 서버 터미널로 접속해서 터미널 내에서 vi 편집기를 이용해 컴포즈 파일을 생성했다. 컴포즈에는 redis와 springboot 어플리케이션을 컨테이너로 띄웠다.
토큰과 인증코드 저장용으로 사용한 캐시 서버이다.
AP 서버로 로컬에서 개발하고, CICD를 통해 Dockerfile을 Docker Hub 레지스트리에 올린다. 이 도커 이미지를 EC2 서버에서 내려 받아 컴포즈로 실행한다.
- Spring boot 프로젝트 내에 Dockerfile 생성하기. Dockerfile은 프로젝트 가장 상위 경로에 생성해야 한다. ( docker-compose 와 동일한 경로 )
FROM openjdk:11
EXPOSE 8080
ARG JAR_FILE=build/libs/backend-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
위의 코드 내용은 실제 프로젝트에서 사용한 코드이다. ARG 부분은 build.gradle 에서도 지정해주었다.
- Github Actions를 이용한 CI/CD 워크 플로우 생성하기
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
name: Java CI/CD with Gradle
on:
pull_request:
branches: [ "main" ]
permissions: write-all
jobs:
build:
runs-on: ubuntu-latest
steps:
# 1) 워크플로우 실행 전 기본적으로 체크아웃 필요
- uses: actions/checkout@v3
# 2) JDK 11 버전 설치
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
# 3) Gradle Caching
- name: Gradle Cashing
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
# 4) Gradle 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# 5) Build exclude test package
#- name: Build with gradle
# run: ./gradlew build -x test
# 6) Set for yml
- name: Make application-secret.yml
run: |
cd ./src/main/resources
touch ./application-secret.yml
echo "${{ secrets.PROPERTIES_PROD }}" > ./application-secret.yml
shell: bash
# 7) 빌드
- name: Build with gradle
run: ./gradlew bootJar
# 8) Docker 빌드 & 푸쉬
- name: docker build and push
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
docker build -f Dockerfile -t duaily .
docker tag duaily ${{ secrets.DOCKER_USERNAME }}/duaily_backend
docker push ${{ secrets.DOCKER_USERNAME }}/duaily_backend
# 9) Deploy
- name: Deploy
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}
script: |
docker stop duaily
docker rm duaily
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/duaily_backend
sudo docker-compose up -d
docker rmi -f $(docker images -f "dangling=true" -q)
main 브랜치로 PR이 생성되는 시점에 트리거를 발생한다. 아래 stpes 에 명시된 작업을 차례로 진행한다. 각 단계에서 어떤 작업을 하는지 주석을 참고하길 바란다.
여기서 주의깊게 봐야 하는 부분은 application-secret.yml 이다. build 시, 기본으로 지정되는 프로퍼티 파일은 application.yml 파일이며 해당 파일에 노출하지 말아야 하는 데이터를 application-secret.yml로 작성하였다. 해당 파일은 gitignore로 github 상에서 보여지지 않는다. 이 내용을 actions에서 사용할 수 있도록 secrets 에 파일 내용을 그대로 복붙하였다.
여기서 touch는 새로 파일을 생성하겠다는 의미의 명령어이며, echo는 뒤에 오는 내용을 읽는다는 의미이며 >
는 우측에 작성한다는 의미이다.
그 후, jar 파일을 생성한다.
Docker Hub repository에 이미지를 올리고 내려 받을 것이기 때문에, 회원가입이 사전에 이루어져야 한다. 그리고 secrets에 아이디와 비밀번호, 레포지토리명을 넣어준다. 도커 이미지 파일을 만들어서 push를 한다.
마지막으로 EC2에 접속해서 기존에 실행중이던 duaily라는 이름의 container를 중지시키고 삭제한다. 그리고 레포지토리에서 이미지를 pull 하고 EC2 내에 정의되어 있는 docker-compose 파일을 실행한다.
- EC2 내에서 docker-compose 작성하기
ssh를 이용해서 EC2 터미널로 접속한다.
vi docker-compose.yml
위의 명령어를 입력하고 아래의 사진처럼 내용을 입력한다.
redis와 duaily 스프링 어플리케이션을 컴포즈로 구성하여 container를 띄운다는 의미이다.
위의 내용을 입력한뒤 ESC 버튼을 누르고 :wq
를 입력하여 저장한다.
- AWS EC2 사이트로 접속하여, 보안 그룹의 인바운드 규칙을 수정한다. 8080 포트를 기본으로 접근 가능하도록 해준다.
- gitignore 파일
공개할 수 없는 정보들을 CI/CD에서 사용해야 하기 때문에 secrets에 해당 파일의 내용을 미리 저장한다. 그리고 shell 스크립트로 해당 내용을 불러와 세팅해주는 작업이 필요하다. 자세한 건 workflow를 참고하기 바란다.
- AWS EC2 용량
서버 메모리가 1GB 인데, 스프링 서버가 용량을 매우 많이 차지해서 도커 컴포즈를 실행할 때 메모리 부족으로 인해 오류가 발생한다. 이를 해결하기 위해 swap으로 usable 메모리 용량을 늘려주었다. -> 이것 때문에 많은 시간을 소비했다.