Dev/AWS

[AWS] 자동화 배포 구축 일기 (feat. 환경변수)

yo0oni 2024. 1. 27. 15:07

 

약 일주일 간의 고생이 방금 끝났다.. 끝이 안 보이던 문제가 해결되니까 허무하면서도 뿌듯하다..! 지난 일주일간 있었던 일을 적어보자면 

 

1. 탄력적 IP 부여해 줘도 접속 안 됨

인바운드 규칙으로 Port 열고 인스턴스에 JDK를 설치해서 해결했다. 처음에는 apache2도 설치했다가, 웹서버를 왜 사용했지..? 라는 의문과 함께 apache2는 삭제했다. 사실 헤매다가 네트워크 ACL 설정까지 갔는데 솔직히 너무 어려워서 울면서 공부했다.. 근데 막상 쓰지 않았다..

 

2. CodeDeploy 배포 실패

이 문제는 CodeDeploy Agent 설치해서 해결.. 근데 이 에이전트 하나 설치하는데 Gem 권한 문제, Ruby 버전 문제, ARM64 Rbenv 문제 등 참 많은 문제가 복합적으로 발생했다.. 나는 MacOS 버전과 Ruby의 충돌 문제였다. 아래 일본인 개발자 분 글 보고 해결했다.

https://qiita.com/notakaos/items/e3e30443b1e57f84e7d8

 

M1 Macでrbenv install 3.2.0を実行するとBUILD FAILEDがでる問題と解消方法 - Qiita

忙しい人向けrbenvでruby 3.2.0のビルドエラーに詰まった場合は以下を実行する。brew install libyamlrbenv install 3.2.0動作確認環境M1 M…

qiita.com

 

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

 

[Java] Web server failed to start. Port 5000 was already in use. (MacOS)

로컬에서 프로젝트를 빌드했는데 해당 에러가 떴다. 포트 문제인 것을 바로 알 수 있었다. 우리 프로젝트는 5000번 포트로 지정해 뒀기 때문에 5000번 포트가 이미 사용 중이니 삭제하라는 문장이

yooooooni.tistory.com

 

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
 

[AWS] CodeDeploy의 scripts/deploy.sh를 제대로 작성해보자

앞 게시글을 보면 나의 배포 일기를 확인할 수 있다. https://yooooooni.tistory.com/132 [AWS] EC2 배포 일주일 삽질 스토리 (feat. 환경변수) 약 2주간의 삽질이 방금 끝났다.. 끝이 안 보이던 문제가 해결되니

yooooooni.tistory.com

 

자고 일어났는데 학교 선배가 모르는 거 있으면 도와주겠다는 카톡이 와있었다. 내가 어제 블로그에 올린 글을 본 것 같았다..(그 글에도 에러에 대한 푸념이 있다)

 

선배가 알려준 방법은 jar에 환경변수를 넣기 위해서는 EC2 우분투 환경에서 bash_profile이 아니라 etc/environment에 환경변수를 설정하는 것이었다. 

 

내가 시도할 수 있는 어떤 방법이라도 다 해보고 있었기 때문에 바로 저 방법을 실행했다. 근데 바로 됐다..

방법은 아래와 같다.

sudo nano /etc/environment

해당 명령어를 통해 environment 파일에 들어가 수정한다.

 

처음에는 PATH 변수만 있을텐데 따로 설정하고 싶은 환경변수들을 추가해주면 된다. 반드시 큰 따옴표 안에 넣어주어야 한다!!

 

그렇게 해주면 평생 404만 띄울 것 같았던 요청에서 200 응답을 받을 수 있다.. 이렇게 나의 삽질 일기는 허무하지만 행복하게 끝이 난다. 고난과 역경이 많았지만 그래도 좋은 경험이었다.(AWS 배포 신고식..⭐️) 긴 시간 고생한 만큼 머릿속에서 나가지 않을 것 같다!

 

 

사실 /etc/environment는 문제를 빨리 해결하기 위해 사용한 방법이고, 가급적이면 해당 파일에 환경변수를 넣지 않는게 좋다. 모든 사용자가 접근할 수 있는 파일이기 때문에 .bashrc에 넣는 게 권장된다.

 

 

 


 

 

+) 현재는 자동화 배포까지 성공한 상태이다!!!

https://yooooooni.tistory.com/133

 

[AWS] CodeDeploy의 scripts/deploy.sh를 제대로 작성해보자

앞 게시글을 보면 나의 배포 일기를 확인할 수 있다. https://yooooooni.tistory.com/132 [AWS] EC2 배포 일주일 삽질 스토리 (feat. 환경변수) 약 2주간의 삽질이 방금 끝났다.. 끝이 안 보이던 문제가 해결되니

yooooooni.tistory.com


이 글은 삽질 일기를 잊지 않기 위해 두서없이 적은 것이고, 내가 배운 것들은 다시 하나하나 정리할 예정이다. 

아래는 6번 문제를 해결하면서 참고한 블로그이다.

 

https://velog.io/@jonghyun3668/SpringBoot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-EC2-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0

 

SpringBoot 프로젝트 EC2 배포하기

깃헙에 있는 프로젝트를 AWS EC2에 git clone을 통해 내려받아 jar 파일 빌드를 해보겠습니다.(EC2 인스턴스는 우분투로 진행합니다. 또한 따로 배포 시스템을 구축하지 않고 수동으로 배포하는것만

velog.io

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

 

환경 변수 및 설정

환경 변수는 운영 체제 또는 응용 프로그램(예: Pycharm)에게 중요한 정보를 제공하거나, 시스템 동작을 제어하는 데 사용환경 변수는 대소문자를 구분하며, 일반적으로 다음과 같은 용도로 사용

velog.io