개발자들이 낭만이라고도 생각하는 '눈물 젖은 커피와 함께 며칠간 밤을 새우며 오류를 잡으려고 애쓰다가 전혀 생각지도 못했던 곳에서 간신히 찾아낸 작은 버그 하나의 추억'이라는 건, 사실 '진작에 충분한 테스트를 했었다면 쉽게 찾아냈을 것을 미루고 미루다 결국 커다란 삽질로 만들어버린 어리석은 기억'일 뿐이다.
- 토비의 스프링 <2장 테스트>
약 일주일 간의 고생이 방금 끝났다.. 끝이 안 보이던 문제가 해결되니까 허무하면서도 뿌듯하다..! 지난 일주일간 있었던 일을 적어보자면
1. 탄력적 IP 부여해 줘도 접속 안 됨
인바운드 규칙으로 Port 열고 인스턴스에 JDK를 설치해서 해결했다. 처음에는 apache2도 설치했다가, 웹서버를 왜 사용했지..? 라는 의문과 함께 apache2는 삭제했다. 사실 헤매다가 네트워크 ACL 설정까지 갔는데 솔직히 너무 어려워서 울면서 공부했다.. 근데 막상 쓰지 않았다..
2. CodeDeploy 배포 실패
이 문제는 CodeDeploy Agent 설치해서 해결.. 근데 이 에이전트 하나 설치하는데 Gem 권한 문제, Ruby 버전 문제, ARM64 Rbenv 문제 등 참 많은 문제가 복합적으로 발생했다.. 나는 MacOS 버전과 Ruby의 충돌 문제였다. 아래 일본인 개발자 분 글 보고 해결했다.
https://qiita.com/notakaos/items/e3e30443b1e57f84e7d8
3. 갑자기 MySQL 악명의 권한 문제 발생
웹서비스 프로그래밍 수업 들을 때 나를 지독하게 괴롭힌 문제가 또 발생했다.. mysql 지웠다 설치하고 다시 권한 주니까 해결..
4. 위 권한 문제 해결하다가 sudo rm -rf를 root 폴더에서 실행
나의 멘탈을 와르르멘션으로 바꾼 사건이다.. 무슨 자신감인지 모르겠지만 cd 명령어와 rm -rf 명령어를 동시에 입력했다. cd 명령어로 특정 폴더에 접속해서 해당 폴더의 파일을 모두 삭제하려고 했던건데 입력한 폴더가 없다는 문구와 함께 cd 명령어가 누락되었고, 그대로 root 폴더에서 sudo rm -rf가 실행되었다... 몇천개의 많은 파일이 눈 앞에서 증발했다. 중간에 멈춰보겠다고 컨트롤 C 했다가 뭐가 날아가고 뭐가 살았는지 알 수 없게 됐다.. (깃크라겐에 있는 프로젝트들이 순식간에 사라지고 인텔리제이에서 열어둔 프로젝트들이 하나씩 사라지는 공포까지 경험)
5. rm -rf가 쏘아 올린 맥북 포맷
몬터레이 화석에서 소노마 새내기로 입학. 맥북을 포맷하고 OS를 다시 설치하면 자동으로 AirPlay 모드가 켜져 5000번 포트를 사용하게 되니 반드시 꺼줘야 한다.
https://yooooooni.tistory.com/128
6. EC2 우분투 환경에서 jar 파일이 안 돌아가는 것을 확인 ⭐️⭐️⭐️⭐️⭐️
지친 마음으로 우분투에서 코드를 클론 받아 빌드했는데 jar 실행에 실패했다.. 로컬 Application으로는 잘 돌아갔기 때문에 jar 역시 잘 돌아갈 것이라고 생각했다.. 멍청했다 진짜.
이때 http://<Public IP>:8080까지는 돌아갔는데 뒤에 api를 붙여주면 404 에러가 뜨는 상황이었기 때문에 무조건 jar 문제라고 확신했다. api url를 입력했을 때 404가 뜨는 건 EC2 문제가 아니라 자바 파일 문제일 것 같았기 때문이다. 솔직히 이때쯤엔 뭐라도 좋으니까 시도할 수 있는 방법을 찾아내려고 했다.
DB 보안 때문에 따로 작성해둔 환경변수를 application.yml에 주입해줘야 하는데 안되고 있었다. 이때 구글링을 해도 해결이 되지 않았다.. 다른 사람들은 다 되는데 나만 안 되는 그런 상황이 발생했다.. 이때부터 극도로 심란해졌다.
새벽 4시 반에 혼자 삽질하다가는 눈물이 날 것 같아서... 스프링 오픈채팅방에 여쭤봤다.. 다행히 외국에 계시는 왕친절 개발자분께서 답장해 주셨다. 그러나 나처럼 설정하면 되는 게 맞다고 하셨다.. 해결하지는 못했지만 덕분에 부담감이 엄청 많이 줄었다.
이때 내가 시도한 방법은 zshrc에 환경변수를 export 해주거나, EC2 우분투 환경의 bash_profile에 환경변수를 직접 추가해 주는 방법이었다. 하지만 되지 않았다. 이때가 아침 6시였고, 갑자기 EC2 SSH 환경도 들어가지지 않아서 EC2를 중지시키고 잠을 취했다..(이때 멍청했던 게 탄력적 IP 연결해 둔 상태인데 인스턴스를 꺼버려서 0.03달러 청구됨)
그 와중에 자고 일어나서 까먹을까 봐 입력할 명령어를 미리 적어두고 잤다..
위에서 말하지 않은 게 있는데, 자동화배포 대신 수동 배포를 선택한 이유는 EC2 환경에서 직접 실행하고 정확한 로그를 확인할 수 있었기 때문이다. 결론적으로 CodeDeploy가 실행한 스트립트가 문제 원인이였지만, 이 당시에는 문제 원인을 알 수 없었기 때문에 할 수 있는 다른 방법을 시도한 것이다.
+) 배포 후 api가 제대로 동작하지 않았던 이유는 codedeploy deploy.sh 문제였다. 스크립트를 잘못 작성해서 jar을 인식하지 못한 것이 원인이었다. 아래 링크를 타면 확인할 수 있다.
https://yooooooni.tistory.com/133
자고 일어났는데 학교 선배가 모르는 거 있으면 도와주겠다는 카톡이 와있었다. 내가 어제 블로그에 올린 글을 본 것 같았다..(그 글에도 에러에 대한 푸념이 있다)
선배가 알려준 방법은 jar에 환경변수를 넣기 위해서는 EC2 우분투 환경에서 bash_profile이 아니라 etc/environment에 환경변수를 설정하는 것이었다.
내가 시도할 수 있는 어떤 방법이라도 다 해보고 있었기 때문에 바로 저 방법을 실행했다. 근데 바로 됐다..
방법은 아래와 같다.
sudo nano /etc/environment
해당 명령어를 통해 environment 파일에 들어가 수정한다.
처음에는 PATH 변수만 있을텐데 따로 설정하고 싶은 환경변수들을 추가해주면 된다. 반드시 큰 따옴표 안에 넣어주어야 한다!!
그렇게 해주면 평생 404만 띄울 것 같았던 요청에서 200 응답을 받을 수 있다.. 이렇게 나의 삽질 일기는 허무하지만 행복하게 끝이 난다. 고난과 역경이 많았지만 그래도 좋은 경험이었다.(AWS 배포 신고식..⭐️) 긴 시간 고생한 만큼 머릿속에서 나가지 않을 것 같다!
사실 /etc/environment는 문제를 빨리 해결하기 위해 사용한 방법이고, 가급적이면 해당 파일에 환경변수를 넣지 않는게 좋다. 모든 사용자가 접근할 수 있는 파일이기 때문에 .bashrc에 넣는 게 권장된다.
+) 현재는 자동화 배포까지 성공한 상태이다!!!
https://yooooooni.tistory.com/133
이 글은 삽질 일기를 잊지 않기 위해 두서없이 적은 것이고, 내가 배운 것들은 다시 하나하나 정리할 예정이다.
아래는 6번 문제를 해결하면서 참고한 블로그이다.
https://velog.io/@jk01019/%ED%99%98%EA%B2%BD-%EB%B3%80%EC%88%98-%EB%B0%8F-%EC%84%A4%EC%A0%95
'Dev > AWS' 카테고리의 다른 글
[AWS] EC2 + CodeDeploy + S3 + GithubActions 조합으로 자동화배포 구축하기 - (2) CodeDeploy 및 S3 세팅 (0) | 2024.04.15 |
---|---|
[AWS] EC2 + CodeDeploy + S3 + GithubActions 조합으로 자동화배포 구축하기 - (1) EC2 인스턴스 생성 및 세팅 (0) | 2024.04.12 |
[AWS] io.awspring 라이브러리를 활용하여 SpringBoot & Amazon S3 연동하기 (0) | 2024.03.12 |
[AWS] CodeDeploy의 scripts/deploy.sh를 제대로 작성해보자 (1) | 2024.01.29 |
[AWS] CPU 사용률 급증으로 인한 EC2 무한 로딩 해결 (1) | 2024.01.27 |