문제 상황
- 기존 설정
- application.properties 파일에서 기본적으로 server.port=8080으로 설정되어 있었습니다.
- application.yml 파일에서는 여러 프로파일(local, blue, green)을 정의하였으며, 각 프로파일에 따라 다른 서버 포트를 설정하려고 했습니다.
- local: server.port=8080
- blue: server.port=8080
- green: server.port=8081
- CICD 파이프라인에서의 문제
- 배포 후, 특정 프로파일 (blue 혹은 green)을 활성화한 상태에서 서버에 접근하려고 했습니다. 이때, 서버가 지정된 포트로 열리지 않아 Health Check (Check deploy server URL) 단계에서 에러가 발생했습니다.
- Health Check에서 사용된 URL은 ${{ secrets.LIVE_SERVER_IP }}:${{ env.STOPPED_PORT }}/env로 설정되어 있었으며, 해당 요청이 실패했습니다.
- 로그에서는 "코드 7" 오류가 발생했으며, 이 오류는 서버에 접근할 수 없음을 의미하는 에러였습니다. 블로그에서는 요청을 시도하는 시간이 짧다는 조언을 받았고, max-attempts와 retry-delay 값을 늘리는 시도를 했지만 여전히 문제는 해결되지 않았습니다.
문제 원인
문제의 근본적인 원인은 application.properties와 application.yml의 우선순위 충돌에 있었습니다.
- application.properties에 설정된 server.port=8080이 우선 적용되었고, 이는 모든 환경(blue, green)에서도 8080 포트로 서버가 열리게 했습니다.
- 따라서, application.yml 파일에서 green 프로파일에 대해 server.port=8081로 설정했음에도 불구하고, 실제로는 8080 포트로만 서버가 열렸던 것입니다.
트러블슈팅 과정
- Health Check 파라미터 조정
- 처음에는 Health Check 시도 시간을 늘리기 위해 max-attempts와 retry-delay 값을 수정하는 방식으로 문제를 해결하려고 했습니다. 하지만 이것은 근본적인 해결책이 아니었고, 포트 문제를 해결하지 못했습니다.
- 로그 분석
- 문제의 원인을 파악하기 위해 서버 로그를 분석한 결과, green 환경에서도 8080 포트로 서버가 실행되고 있었음을 확인했습니다. 이는 application.properties 파일의 설정이 application.yml 파일의 설정보다 우선 적용된다는 사실을 발견하게 된 계기였습니다.
- 해결책
- application.properties 파일에서 server.port=8080 설정을 제거하거나, 필요하다면 각 프로파일별로 다른 포트를 설정할 수 있도록 application.yml 파일에서만 포트 설정을 관리하도록 변경했습니다.
- 최종적으로, application.yml 파일의 각 프로파일에 따라 서버가 올바른 포트(예: green 프로파일에서 8081 포트)에서 열리도록 설정을 정리했습니다.
최종 해결 방법
- application.properties와 application.yml의 포트 설정 중복 제거: application.properties 파일에 존재하던 server.port=8080 설정을 삭제하거나, 모든 포트 설정을 application.yml 파일에 집중시킴으로써 우선순위 충돌 문제를 해결했습니다.
- CICD 파이프라인 테스트 재시도: 수정된 설정으로 다시 배포한 후, Health Check가 성공적으로 통과하고, blue 및 green 환경에서도 각각의 포트에서 서버가 정상적으로 동작하는 것을 확인했습니다.
느낀 점
이 문제를 해결하면서, 설정 파일 간 우선순위 및 환경별 설정 관리를 어떻게 해야 하는지 배웠습니다. 특히, 다양한 환경에서 서버를 배포할 때 설정 파일의 충돌이나 중복을 주의해야 하며, 우선순위를 명확히 관리해야 한다는 점을 깨달았습니다.
또한, 단순히 Health Check의 시간을 늘리는 것만으로 문제를 해결할 수 없었고, 근본적인 원인을 찾기 위해 로그를 꼼꼼히 분석하는 것이 중요하다는 것을 경험했습니다. 이번 경험을 통해 추후 배포 환경에서 발생할 수 있는 문제에 대한 예방책을 세울 수 있었습니다.