ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • EC2, REDIS,Docker로 CI/CD 구축하기
    백엔드 : 서버공부/Spring 2024. 7. 10. 23:34
    728x90

    방학동안 프로젝트를 진행하면서 깃허브 액션을 기반으로 CI/CD를 구축하는 파트를 담당하게 되었다.

    EC2, RDS 관련된 작업이라 여간 신경쓸게 한두가지가 아니다.

     

    본 포스팅에선 설명하지않겠지만 CI/CD 가 정상적으로 이루어진줄 알았지만 EC2 인스턴스에 직접 접속하여 로그를 살펴보니 RDS연결이 계속 실패했던 문제도 있었다..(인바운드, 아웃바운드 규칙을 구글링결과처럼 모든 외부에게 허용 등을 하여도 안됬었는데.. private ip를 규칙에 추가하고, 아래보이는 컴퓨팅 리소스에 사용중인 EC2 인스턴스를 연결하니 해결되었다.

     

    그런데 문제가 또있었다. 우리 프로젝트는 JWT 토큰을 레디스 서버에 저장하여 관리한다. 그렇기 때문에 레디스서버와 스프링서버가 동시에 작동중이어야 한다!
    개발환경인 로컬환경에서는 설정이 아주 쉽다.

    물론 레디스 설정파일을 좀 만져줘야하긴하지만 완성이 되었다면

    application.yml 과 같은파일에서 아래처럼 설정해주면 된다.



    배포 환경도 간단할 줄 알았다! ec2 인스턴스에 레디스를 설치한 뒤 실행만 시켜놓으면 local환경이랑 마찬가지로 localhost로 호스트를 지정해두면 문제없을 줄 알았다..!

    그렇다 착각이었다..

     

    배포후 토큰발급이 배포환경에서도 잘되는지 확인하기위해 API로 요청을 보냈는데 403오류만 뱉었다.

     

    테스트용 API는 잘 응답하는것 보니 서버문제는 아니었다.

    서버가 자신이 살아있음을 알리고있다

     

    토큰이 필요없는 조회 API도 문제없는것을 보아 레디스쪽에 문제가 생겼음에 틀림없었다!

     

    인스턴스에 접속해 로그를 까보았더니 역시 레디스연결에 실패하고있었다.

    이때부터 나의 삽질이 시작되었다..

     

    우선 처음엔 호스트명이 잘못된 줄 알았다! 

    따라서 호스트명을 EC2 퍼블릭 IP로 바꾸었다!

     

    될리가 없었다. 

    JAR파일은 도커 컨테이너에서 실행되는데 EC2에있는 레디스에 접속하려하니 보안 문제가 생길 수 밖에없었다..

    잘 알려진 해결방법으로는 도커 컴포즈를 이용해 레디스 컨테이너를 새로 만들고 두 컨테이너 사이의 통신으로 해결할 수 있는것 같은데..

    또한 이 방법이 컨테이너를 사용하는 목적에도 부합해 보여였다.

    하지만 도커 컴포즈는 도커 초짜인 나에겐 아직 버거운 내용이었다..

     

    도커 컴포즈사용법을 구글링하며 머리아프던 도중 고생을 덜어줄 방법이 생각이 났다

    바로 하나에 컨테이너에 레디스와 스프링서버 두 서버 모두 설치하고 실행하는 것이다!

    이 방법은 기존 워크플로우를 수정할 필요도 없어서 우선 해당방법으로 배포된 서버를 정상화 시키기로 하였다!

    방법은 간단하다 

    먼저 도커파일에 레디스 설치명령어를 작성해야한다!

     

    그 후

    ENTRYPOINT

    라는 명령어를 통해 도커컨테이너가 시작될때 스프링 서버와 레디스 서버를 동시에 실행하도록 하면된다!

    이렇게 하는이유는 배포자동화를 해놓고 레디스를 수동으로 설치하는 바보같은 상황을 방지하기 위해서이다..

    FROM openjdk:17-alpine
    
    # Install Redis
    RUN apk update && \
        apk add redis
    
    # Copy application JAR
    ARG JAR_PATH=build/libs/*.jar
    COPY ${JAR_PATH} /home/server.jar
    
    # Expose ports
    EXPOSE 8080 6379
    
    # Entry point
    ENTRYPOINT sh -c "redis-server --daemonize yes && java -jar /home/server.jar"

     

     

    위 방법으로 급한데로 서버를 살려두었다.. 추후 도커 컴포즈를 공부해야겠다..!

Designed by Tistory.