[삽질기록] 배포 삽질기 🤦🏻‍♀️

케이·2022년 6월 26일
4

삽질기록

목록 보기
2/7

주의 (글을 읽기 전에..)

  • 너무 초보적인 삽질에 속이 터질 수 있지만 누군가에겐 도움이 되었으면 좋겠다는 마음으로 글을 씀
  • 당신의 귀중한 시간을 좀 먹을 수 있으니 절대 따라하지 마시오.

배포의 시작

코쿼 과제(?)를 하면서 배운 수동배포와 자동배포를 넘어 Github Action과 Docker를 사용한 배포를 시도해보기로 했다. 하지만 쪼렙인 나는 인프라에 대해서 하나도 모르기 때문에 코쿼 인프라의 신 민지노의 블로그를 보고 배포 구상을 해보았다. (사실상 따라한거나 마찬가지라고 할 수 있다. 다시 한번 민지노에게 깊은 감사의 말씀을 전합니다. 고맙습니다.)

WAS와 DB를 나누어서 배포를 하기 전에
쌩초보인 나에게는 인스턴스 하나에 배포를 시도하고
그 다음 단계로 나아가는 것이 더 낫다고 판단해서 아래와 같이 Flow를 따라가기로 했다.

그 과정에서 한 여러 삽질들을 공유하고자 이 글을 작성한다.

1. (삽질이라고도 말할 수 없는) 헛발질

EC2 인스턴스에 MYSQL을 설치하는 과정에서 MYSQL ROOT 사용자 비밀번호 설정 도르마무의 함정에 걸렸다.

조건에 맞게 비밀번호를 입력해도 계속해서 Failed Error가 발생했다. 열번쯤 비밀번호를 다시 입력해보다가 이건 뭔가 아니다 싶은 생각이 들어 구글신에게 도움을 요청했고 아래의 유튜브를 발견했다.

Failed! Error: SET PASSWORD has no significance for user ‘root’@’localhost’ as the authentication

영상이 귀찮으신 분들을 위한 간단요약 - 해당 과정에서 빠져나와서 MYSQL에 root 사용자로 접속 한 뒤 비밀번호를 변경해주면 된다.

2. 본격삽질

Github action으로 성공한 것을 확인하고 EC2 인스턴스에서 docker -ps로 확인해보니.. 아무것도 떠 있지 않았다.
로그를 확인해보니 Spring 실행 중에 MYSQL 연결 오류가 발생하고 있었다. MYSQL 설치도 잘 해놨고 데이터베이스도 잘 만들어두었는데 왜 연결이 되지 않는지 알 수가 없었다.

처음부터 차근 차근 마인드를 가지고 체크해봐야 할 것들 + 동료들의 도움을 받아 체크리스를 작성하고 하나씩 천천히 체크해나가기로 했다.

사용자 환경변수, Bind-address 등등 체크리스트 항목들을 하나씩 확인 하던 중 접속 URL이 잘못된 것을 알게 되었다.

MYSQL을 연결할 주소(URL)가 jdbc:mysql://localhost:3306/db이름 으로 설정되어 있었던 것.

MYSQL과 DOCKER가 같은 EC2 인스턴스 내부에서 작동(?)하고 있기 때문에 로컬 호스트로 통신을 한다고 생각하고 작성한 것이었다.

하지만 MYSQL은 도커 이미지 기준 외부에 있는 것이었고 이에 URL을 EC2인스턴스의 public IP로 변경해주니 이후에는 문제없이 연결 할 수 있었다.

3. 삽질이 하나라서 서운하셨다구요? 준비했습니다 1+1

2번의 문제를 해결했으니 이젠 잘 되겠지?? 하고 생각했는데 이제는 Github Action Deploy에서 계속 오류가 발생했다.

문제 해결을 위해 환경변수, Gradle.yml을 체크했지만 방법을 찾을 수가 없었다.
그때 문득.. 설마.. 하며 public IP를 체크해봤는데..

EC2 인스턴스를 중지/재시작 한 뒤에 변경된 public IP를 적용하지 않아서 발생했던 오류였다.🤦🏻‍♀️

4. 끝나지 않은 삽질

GitHub action으로 빌드 시에 해당 오류가 자꾸 발생했었다.
테스트 코드를 주석 처리하거나 삭제해버리거나 ./gradlew bootjar로 빌드한다면 가장 간단하게 해결 할 수 있었지만 그 방법말고도 해결할 수 있는 방법이 있지 않을까라고 생각했다.

먼저, 루이의 도움으로 test를 실행할 때 사용할 yml파일을 작성하고 다시 실행해보았지만 똑같은 오류가 발생했다. 그렇다면 로컬에서는 build 성공을 했는가? 그럴리가 없지.. 같은 오류가 발생했다.🤦🏻‍♀️

DB와의 문제로 보여서 dialect도 설정해보았지만 소용이 없었다.

그러다 문득 환경변수 생각이 나서 build 할때도 인텔리제이에서 환경변수를 설정해주니 해결이 되었다??????!!!!!!!

그렇다면 GitHub action 시에 나는 같은 오류는 어떻게 해결해야 하는가?

나의 경우(EC2 인스턴스 하나에 모든 것을 때려박음)엔 ./gradlew build 시에 환경변수를 가져와서 test실행할 때 DB와 연결 할 수 있도록 설정해주면 되겠지? 라고 생각했다.(정확히는 그 답을 우리의 루이 선생님께서 주셨음) 그렇게 하면 해결 될거라는 강한 확신이 들었다(만 실제로 하진 않았다)

왜 안했는데..? 🤷🏻‍♀️

실제로 확인해보지 않은 까닭은 지금이 배포 마무리 단계가 아니라서.
최종 배포는 WAS/DB를 분리한 환경에서 진행할 계획이라 해당 단계에서는 더 해보진 않았다.

그렇담 WAS/DB가 분리 되어 있는 환경이라면 해당 문제가 안남??????🤷🏻‍♀️

WAS/DB가 분리되어 있는 환경에선 WAS로 쓰일 인스턴스에 MYSQL이 설치되어 있으면 문제가 되지 않을것이라는 루이의 생각에 동의한다. 배포를 하면서 이부분을 꼭 염두에 두고 해봐야 겠다는 생각을 한다.

삽질기를 정리하며..

  • 기본에 충실하자. 잊지말고 다시 보자. 환경변수. 환경변수 항상 체크하자.
  • 많은 분들이 주신 도움을 잊지말자. (나도 빨리 성장해서 누군가를 돕고 나누고 싶다 ㅠㅅㅠ)

항상 생각하지만 내가 쪼렙인 이유는 기본을 놓칠 때가 많아서 + 기본이 안되어 있어서라고 생각한다. 항상 기본부터 잊지 않고 채워나가고 확인할 수 있도록 학습해야겠다.
그리고 삽질 과정에서 도와준 많은 동료들(루이, 쿠킴, 리아코 등등등등 너무 감사한 동료들)을 잊지 않고 나도 성장해서 누군가에게 꼭 도움을 줄 수 있으면 좋겠다. 끝.

profile
삽질하며 깨닫고 배웁니다. (a.k.a 프로삽질러) + 이 구역의 회고왕

1개의 댓글

comment-user-thumbnail
2022년 6월 26일

삽질을 이겨내고, 배포 완료 하셨네요.
저는 VPC 내에 IGW 랑 해서 넣어놨는데 포트 개방이 ec2에서 허용 시키는게... 제 생각과 달라서 삽질 많이 했어요. CORS 관련 처리는 스프링에서 하고, 네트워크..... 모르겠네요.ㅎㅎ
2틀 삽질하고 스크립트로 배포 하고, CI/CD는 미루고 있는데,
나중에라도 케이 처럼 성공하면 좋겠습니다. 수고하셨습니다👍

답글 달기