[Tistory] [AWS EC2] 테스트 서버 에러 기록

원글 페이지 : 바로가기

✅ 테스트 서버 API 1차 개발 완료 후, 프론트 분들이 테스트와 함께 개발하실 수 있도록 테스트 서버를 만들어 달라는 요청을 받았다. 많은 클라우드 서비스가 있지만, 시간이 없는 관계로 전에 한번 경험했던 EC2를 사용해 테스트 서버를 배포했다. ( 그때의 수많은 시행착오를 기억하지 못했다.. ) 서버는 그냥 간단하게 EC2에 Nginx를 설치해 배포했고 80번 포트로 요청했을 때, spring 서버인 8080포트로 연결되도록 설정해 주었다. ✅ 과정, 시행착오 1. 먼저, EC2를 만들고, ssh 를 통해 연결해 주었다. 이 과정은 예전 수업 자료를 통해 해주었고, ssh 연결 도중 WARNING UNPROTECTED PRIVATE KEY FILE 권한이 너무 많이 열려있어 발생하는 에러로, 해당 블로그를 참고해 해결해 주었다. https://velog.io/@rockwellvinca/AWS-SSH-%EC%A0%91%EC%86%8D-%EC%8B%9C-WARNING-UNPROTECTED-PRIVATE-KEY-FILE-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0 🦥[AWS] SSH 접속 시, WARNING UNPROTECTED PRIVATE KEY FILE 에러 해결 먼저 SSH를 통해 외부에서 AWS로 접속하는 방법은 다음과 같다.1\. EC2 > 인스턴스 > 연결 하고자하는 인스턴스 체크 > 연결2\. SSH 클라이언트로 이동하여 주황색으로 표시된 📰 복사 버튼 클릭3\. 외 velog.io 2. ssh 연결 후, spring 파일을 불러오기 위해 git clone을 이용해 불러왔다. 이후의 과정은 해당 블로그를 참고해 진행했다. https://velog.io/@tritny6516/Spring-Boot-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-Nginx-HTTPS-%EC%84%A4%EC%A0%95-2 Spring Boot 배포하기 (Nginx, HTTPS 설정) 2 Spring Boot 배포 [Java11, Gradle, AWS EC2, Route 53] velog.io 3. sudo ./gradlew build 환경 : java 19 설치, gradle을 Test 제외 명령어 실행을 위해 sudo apt install gradle ( 이때 이렇게 대충 설치하면 안 됐었다..! ) 로 설치 – gradlew build 후에 에러들 1. command not found, permission denied command not found로 에러가 발생해 해당 명령어에 관해 설치를 해줘야 하는 줄 알았는데, 권한이 없어 나오는 에러였다. https://ddingg.tistory.com/45 SpringBoot – ./gradlew : command not found ec2에 SpringBoot 프로젝트를 배포하기위해 jar 파일을 gradlew를 이용해 실행시키려고 하는 도중 에러 발생. chmod +x gradlew 위의 명령어로 gradlew에 실행 권한 부여. ddingg.tistory.com 해당 블로그에 나온 명령어를 통해 해결했다. 2. 무한 로딩 처음에는 무한 로딩을 서버 종료 후 다시 키는 방안으로 해결해 진행을 했는데, 후에는 이러한 방식으로도 진행이 되지 않아 해결 방법을 찾아보았다. 프리티어 사용 시에 메모리 부족으로 인해 자주 발생하는 경우라고 한다. https://sundries-in-myidea.tistory.com/102 AWS EC2 프리티어에서 메모리 부족현상 해결방법 AWS free tier를 사용하다보면 2%가 부족할 때가 있다. AWS 프리티어는 가난한 대학생에게는 한줄기 빛과 같은 존재인데, AWS의 프리티어라서 적게 돈이 나가는 것도 좋고, 실제로 이것저것 해볼 수 있 sundries-in-myidea.tistory.com 해당 블로그를 통해 해결 후, 무한 로딩 현상은 없어졌다. 3. 잘못된 자바 버전 설치 프로젝트에 쓰인 자바가 17 이었는데, 19 버전으로 자바를 설치해 오류가 나타났다. 해당 글을 참고해 자바 19 삭제 후, 자바 17 버전으로 다시 깔아주었다. https://devje.tistory.com/193 [UBUNTU] JAVA(자바) JDK 설치, 환경 변수 설정, 자바 삭제 명령어 1. 자바 설치 1. 패키지 업데이트 sudo apt udpate 2. JDK 1.8 설치 (JDK 8) sudo apt install openjdk-8-jdk 3. 자바 버전 확인 java -version 2. 자바 환경 변수 설정 1. 자바 경로 확인 update-laternatives –list java 2. .bashrc 파 devje.tistory.com 프로젝트에 사용된 자바 버전은 build.gradle에서 확인할 수 있다. 자바 버전 확인 자바 버전 확인을 intellij 설정에 project structure에서 진행했는데, 버전 확인을 잘못된 방법으로 한 것 같다. 버전 오류 때문에 해당 오류도 발생한 것 같다. no locally installed toolchains match and toolchain download repositories have not been configured. java.io.FileNotFoundException: /home/ubuntu/Backend/.gradle/8.8/fileHashes/fileHashes.lock (Permission denied) → 이 오류의 경우에는 검색했을 때 gradle 파일의 권한을 변경하라는 해결 방법을 보았었는데, 자바 버전이 맞지 않아서 이거나, gradle 버전이 맞지 않아서 발생했던 것 같다. 4. Test 코드 오류 (aws Execution failed for task ‘:test’) test 관련 오류가 뜨는 것 같아 Test 관련 코드를 제외하고 빌드 하는 명령어가 참고해 진행하던 블로그에 명시되어 있어, 해당 명령어를 실행했다. 하지만 이 명령어 또한 오류가 발생했다. 처음에는 org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException at DataSourceProperties.java:186 오류를 보고 Database 연결이 되지 않아 생긴 문제 같아 mysql 서버를 설치하고, 프로젝트에 맞는 스키마와 테이블을 만들어줬다. mysql 설치는 https://noanomal.tistory.com/328 mysql 설치 및 초기 셋팅 (우분투) mysql 설치 및 초기 셋팅 (리눅스 우분투) MySQL 설치 sudo apt update sudo apt install mysql-server MySQL 포트 설정 sudo ufw allow mysql MySQL 실행 sudo systemctl start mysql [참고1] 서버 재시작시 MySQL 자동 재시작 sudo syste noanomal.tistory.com 해당 블로그를 참고해 진행했다. 하지만 mysql 설치 후에도 해결되진 않았다. 다음으로는 gradle의 버전을 프로젝트에 맞게 재설치 해주었다. 해당 에러가 발생했는지 확실하진 않지만, 테스트 제외 명령어에서 발생한 오류도 gradle의 버전을 바꾸니 해결이 됐다. Could not create service of type PluginResolutionStrategyInternal using BuildScopeServices.createPluginResolutionStrategy(). → gradle 버전과 자바 버전이 맞지 않아 발생한 오류인 것 같다. https://discuss.gradle.org/t/could-not-create-service-of-type-scriptpluginfactory-using-buildscopeservices-createscriptpluginfactory/44820 Could not create service of type ScriptPluginFactory using BuildScopeServices.createScriptPluginFactory() I changed openjdk version to with asdf to 17, and now I tried to change my gradle version to 7.5 with the following command gradle wrapper –gradle-version 7.5 and got this error `Could not create service of type ScriptPluginFactory using BuildScopeService discuss.gradle.org sudo apt install gradle 명령어를 통해 gradle을 설치했는데, 이를 통해 설치되는 버전은 4.4.1 이라고 한다. 먼저 프로젝트에 설치된 gradle의 버전을 확인하기 위해 프로젝트 폴더 > gradle > gradle-wrapper-properties 에서 gradle의 버전을 확인해 주었다. 다음으로 이 블로그를 참고해 설치했던 gradle을 모두 삭제해 주었다. https://velog.io/@coral2cola/Ubuntu-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0 Ubuntu 패키지 삭제하기 Ubuntu에서 기존에 설치했던 패키지를 설정파일까지 완전히 삭제하려면 어떻게 해야할까? velog.io 다음으로 이 블로그를 참고해 맞는 버전으로 설치를 다시 해주었다. https://velog.io/@k0000k/%EB%A6%AC%EB%88%85%EC%8A%A4%EC%97%90%EC%84%9C-Gradle-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0 [Linux/Ubuntu] 리눅스 Gradle 최신 버전 설치, 버전 변경하기 개발중인 Springboot 프로젝트의 개발용 서버가 필요해서 GCP(Google Cloud Platform)에 올리고 CI/CD 구축까지 시도 할 계획을 세웠다. 이 과정에서 여러 문제를 트러블슈팅 하게 되었는데, 그 중에서 해결 velog.io → 성공적으로 명령어가 잘 실행됐다..! 5. contextLoads() FAILED test 코드를 제외하고 나서는 빌드가 잘 실행될 줄 알았는데, 또 다른 에러가 발생했다. 이때 당시에 빨리 테스트 서버를 올려 프론트 분들께 전달을 드렸어야 하는 상황이라, 해당 오류는 해결할 생각을 하지 못하고 다른 방식으로 서버를 배포했다. 다시 구글링을 해보니 세부 오류까지 같은 블로그를 찾았는데, https://soobysu.tistory.com/118 [오류노트] 스프링부트 테스트 contextLoads() FAILED jenkins contextLoads() FAILEDjava.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:142 Caused by: org.springframework.beans.factory.BeanCreationException at AutowiredAnnotationBeanPostProcessor.java:488 soobysu.tistory.com SpringBootTest 어노테이션 설정을 추가해 주면 해결되는 것 같다..! 분명 Test 코드를 제외하고 빌드를 했는데 왜 이 부분에서 에러가 났는지는 모르겠다.. 4. gradlew build를 로컬에서 진행 후에 실행 파일을 EC2로 전송 EC2에서 git clone을 해서 코드를 가져오는 게 gitignore된 파일들 때문에 자잘한 에러가 나는 것 같아서, 로컬에서 빌드 진행 후에 실행파일을 전송하는 방식으로 진행하기로 다시 결론지었다. 로컬에서 빌드 할 때도 에러가 발생했는데, 테스트 코드 관련 에러인 것 같아 테스트 코드를 아예 삭제 후에 다시 빌드 해 주었더니 바로 빌드를 성공했다. 흐허어어엉ㅇ… 해당 실행 파일을 EC2로 scp를 사용해 전송을 해주면 된다. https://velog.io/@happy_quokka/AWS%EC%99%80-%EB%A1%9C%EC%BB%AC-%EA%B0%84%EC%9D%98-%ED%8C%8C%EC%9D%BC-%EC%A0%84%EC%86%A1 AWS EC2와 로컬 간의 파일 전송 AWS EC2와 로컬 간의 파일 업로드, 다운로드 방법 velog.io scp 사용을 위해 참고한 블로그이다. 한번 permission denied 가 떴는데, ec2 public ip 를 잘못 설정해 주어 발생한 에러였다. 5. 전송이 끝난 후에는 nginx 설치, 리버스 프록시 설정을 해주었다. https://yewon-lee.tistory.com/entry/AWS-Spring-Boot3-EC2-%EB%B0%B0%ED%8F%AC [AWS, Spring Boot3] EC2 배포, 서버 스크립트, Nginx 설치 1. EC2 인스턴스 인바운드 규칙 추가(HTTP/S, SSH는 이전에 추가) Spring Boot Server, React Server 접근 허용을 위해 아래와 같이 추가해준다. 2. 서버 Java 설치, 환경변수 설정아래 명령어를 순서대로 yewon-lee.tistory.com 해당 과정을 위해 참고한 블로그이다. 6. 실행 파일 실행, 포스트맨에서 API 호출해 보기 흐허어어어어어어어어어엉ㅇ.. 잘 호출되는 것을 확인할 수 있었다..! 처음 호출했을 경우에는 Failed to parse multipart servlet request 에러가 발생했는데, 해당 api에서는 multipartfile이 전송되고 있지도 않았고, 코드에서도 선언은 되어있었지만 쓰이는 부분은 없었다. 찾아보니 multipart 설정과 관련된 에러 같았고, 설정해 준 파일을 확인해 보니 spring.servlet.multipart.location = / 임시 폴더를 지정해 주는 설정에서 / 으로 지정되어 있었다. 해당 경로에서는 파일을 생성하지 못하도록 권한이 설정되어 있다. 따라서 경로를 /home/temp로 바꿔주니 잘 실행이 되었다. 7. 터미널이 꺼져도 실행파일이 실행되도록 nohup으로 실행 실행파일을 실행시킨 채로 터미널을 계속 둘 수도 없었기에, nohup으로 실행해 터미널이 꺼져도 서버가 실행되는 동안 해당 파일이 실행되도록 했다. https://computing-jhson.tistory.com/126 터미널 종료 후에도 프로그램 계속 실행 방법 (Background 실행, nohup, SIGHUP) 문제 상황 설명 리눅스 환경에서 터미널을 종료시키면 터미널에서 실행시킨 프로그램(ex, python, java, etc.)들도 함께 종료된다. 특히 SSH를 통해 원격으로 서버에 접속하여 프로그램을 실행시키더 computing-jhson.tistory.com 실행 방법이 설명되어 있는 블로그이다. ✅ 깨닫게 된 점 항상 클라우드 서버를 통해 배포할 경우에는 로컬과 환경을 맞춰주어야 한다는 사실을 기억하고 있어야 할 것 같다. 버전 문제로 생긴 에러들이 너무 많고, 빼앗긴 시간이 너무 많아 처음부터 버전 확인을 철저하게 하고 설치를 해주어야 할 것 같다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다