본문 바로가기

개발공부/Error Handling

[AWS] EC2 서버 배포 오류 해결

 

 

 

 

 

 

 

 

pre-project를 진행하면서 프론트 분들과의 API 통신 테스트를 위해서라도 서버 구축과 배포가 제일 시급한 문제였는데 EC2를 생성하고 생성한 인스턴스에 스프링부트 프로젝트를 배포해봐도 웹이랑 포스트맨에서 접속이 안됐다. 분명 보안 그룹 인바운드 규칙으로 80포트도 추가해줬지만 타임아웃 오류가 나면서 접속 자체가 되지 않았다ㅠ

 

 

그래서 일단 시간이 없으니까 로컬 PC를 서버로 만들어서라도 테스트를 해보자 하고 로컬 PC 방화벽 설정에서 포트 번호 인바운드 규칙 추가해서 외부 접속도 허용해주고 준비를 거의 마쳤다. 

그런데 도저히 AWS 배포가 포기가 안돼서..진짜 마지막으로 한 번만 더 해보자는 생각으로 내가 뭔가 놓친 게 없는 지 검색을 해봤다. 왜냐하면 분명 뭔가 사소한 하나를 놓친 것 같은데 그게 뭔지 못 찾는 상황 같다는 느낌이어서 AWS 사용을 하지 않기에는 미련이 좀 남았던 것 같다..ㅋㅋㅋ

 

그렇게 검색을 해보던 중 보안 그룹 인바운드 규칙에 8080으로 추가한 사진을 봤고, 뭔가 이걸 추가하면 될 것 같은 느낌이 들었다.(다시 생각해보니까 무슨 자신감이었는지 모르겠네..ㅎㅎ) 그래서 나도 보안그룹에 8080 포트를 추가해서 다시 스프링부트 프로젝트를 빌드해서 실행해봤다. 

 

 

 

기존 보안그룹 인바운드 규칙 설정

 

 

위의 사진이 기존 보안그룹 인바운드 규칙 설정 해놓았던 것이고 아래의 사진이 8080 포트 추가한 버전이다.

 

 

새로 추가한 인바운드 규칙 설정

 

그랬더니 이번엔 다른 오류가 나타났다!! 그치만 난 이 오류 화면이 반가웠다ㅠㅠ 이제야 연결이 제대로 되는 것 같아서 오류 메시지를 보고 수정하면 정상 작동하지 않을까 하고 기대를 하게 됐다.

 

500 Error

 

오류 메시지는 500 Internal Server Error 였고 EC2 Session Manager 화면에 출력 된 오류 메시지는 CORS 설정에 관련된 것이었다. 스프링부트 WebConfig 클래스 설정에서 수정을 해야하는 부분이 있다고 알려주는 메시지였다. 이 오류 메시지의 해결 방법은 url을 명시적으로 추가하거나 allowedOriginPattern을 ("*")로 추가하라는 것이었다. 정말 친절하게도 해결 방법까지 알려주는 오류 메시지..

 

 

 

EC2 서버 실행 오류 메세지

이런 비슷한 오류를 해결한 경우가 있는지 정보를 찾아봤는데 역시 비슷한 방법으로 이러한 CORS 설정 관련해서 문제가 생겨서 해결한 분들이 계셨다. 나도 찾아보면서 도움이 많이 된 블로그들이 있어서 아래에 참조한 블로그들 링크를 남겨두었다.

CORS 정책에 관해서도 조금 찾아보면서 알게 된 사실은 .allowedCredentials(true)로 설정해놓으면  .allowedOrigins("*")를 전부 허용하는 식으로 추가할 수 없다는 것이다.  allowedOrigns 는 특정 도메인만 허용하는 방식이라 CORS 정책상 * all이 허용되지 않는다고 한다. 그래서 allowedOriginPatterns("*")를 추가하는 것을 권장한다고 한 것. 패턴은 기존  allowedOrigins 보다 확장된 버전이라 일단 credentials 부분을 주석처리하고 패턴을 추가해줬다.

 

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                //.allowCredentials(true) //주석처리함
                .allowedOriginPatterns("*") //추가한 부분
                .exposedHeaders("*");
    }
}

위의 코드 내용을 보면 기존의 .allowedCredentials(true)를 주석 처리해주고 .allowedOriginPatterns("*")를 추가한 것을 알 수 있다. 이렇게 처리를 해주고 다시 서버에 빌드하고 실행을 시켰는데 드디어 테스트 컨트롤러가 정상적으로 작동이 됐다! 

 

 

 

 

TestController 정상 실행 화면

이 Hello world 화면이 어찌나 반갑던지ㅠㅠ

내일은 credentials 부분 주석 해제하고 allowedOrigins 를 주석 처리하고도 다시 테스트 해볼 예정이다.

이 부분이 정상적으로 작동하는 걸 확인하고 이제 프로젝트 소스 코드 작성한 걸로 RDS DB까지 연결하면 서버 구성 작업은 마무리 될 것 같다. 그럼 진짜 기능 구현에만 더 집중할 수 있고 프론트 분들도 프론트 서버 배포해서 중간 중간 API 통신 잘 되는지 확인할 수 있으니까 프로젝트 진행도 더 수월해질 것 같다! 내일은 RDS 연결 하는 것도 성공시키고 기록 남겨놓아야겠다ㅎㅎ

 

 

 

 

 

 

 

 

 

참고한 자료

https://gareen.tistory.com/66

https://korshika.tistory.com/65

https://github-wiki-see.page/m/97kim/mytrip/wiki/4-%ED%8A%B8%EB%9F%AC%EB%B8%94%EC%8A%88%ED%8C%85