환경
- EC2 - Ubuntu 20.04
- 프로젝트 - Spring Boot
- ACM
- AWS 로드밸런서
- AWS Route 53
HTTPS로 설정하는 과정에서 502와 503 에러를 겪었다.
환경을 이렇게 적는 이유는 해결 방안을 검색하다보니 nginx를 사용한 상황과 node 환경에서 서버 셋팅중에 발생하는 문제도 적지 않았기 때문이다.
이 경우 완전 다른 해결방안이 필요하기 때문에 현재 환경을 꼭 확인해야 한다.
처음 발생한 에러는 503.
찾아보니 503에러 발생 원인이 너무 다양하다.
발생한 오류가 정확하게는 503 Service Temporarily Unavailable.
보통 https 503 에러에 대해 검색해보면 '서버가 Request를 처리할 준비가 되지 않은 것을 나타낸다' 라고 많이 얘기한다.
흔히 다운되거나 오버로드 된 상황.
이 오류에 대해 AWS 에서는 '로드밸런서의 대상 그룹에 등록된 대상이 없습니다.' 라는 안내를 해준다.
즉, 로드밸런서를 생성할 때 같이 등록해주는 대상그룹(Target Group)에 등록된 인스턴스가 없다는 것이다.
말 그대로 대상그룹에는 내가 연결하고자 하는 서버가 있어야 연결이 되고 처리해줄 수 있는데 그 연결이 안되어있으니 발생하는 문제라는것.
대상그룹을 처음 생성하면 마지막에 이런 페이지를 볼 수 있다. 여기서 그냥 Create를 누르면 아무 연결도 없이 그룹이 생성된다.
이 상태로 로드밸런서에 대상 그룹을 넣어주면 연결된 인스턴스가 없기 때문에 요청을 처리할 서버가 없게 되고 그럼 503에러가 발생하는 것이다.
그래서 해당 인스턴스를 선택한 뒤 Include as pending below 버튼을 눌러 등록 해줘야 한다.
만약 이미 비어있는 상태의 대상그룹을 만들었다면 해당 대상 그룹명을 눌러 들어간다.
그럼 하단에 Regist할 수 있는 버튼이 있다. 눌러주면 같은 화면을 볼 수 있으니 등록이 가능하다.
이렇게 등록해주면 503 에러는 해결이 된다.
502에러의 경우는 Bad Gateway 오류였다.
이 경우 유효하지 않은 응답을 받을 때 발생하는 오류다.
역시 원인은 다양하지만 보통 잘못된 네트워크 연결이나 과부하 상태에서 발생한다.
AWS에서는 Classic Load Balancer를 통한 502 에러에 대해 다음과 같이 안내가 되어있다.
AWS에서는 로그를 활성화 해 확인하라고 하지만 이 로그는 S3에서 확인할 수 있다.
하지만 난 S3를 지금 사용하지 않는 상황.
도움이 전혀 될 해결 방안이 아니다.
로드밸런서 CloudWatch에서도 전혀 표시되는 문제가 없었다.
한 블로그에서 서버 로그를 확인해보라는 것도 보고 확인해봤지만 애초에 서버에 접근조차 못하는지 로그는 전혀 찍히지 않았다.
그리고 EC2 의 퍼블릭 IP를 통해서는 접근이 가능하고 HTTP로도 문제없이 접근이 가능했다.
문제가 발생하는것은 HTTPS뿐이었다.
그러던중 한 블로그 포스팅을 봤다.
얼마 전 겪은 '502 : Bad Gateway' 오류와 느낀 점
한 4일 전 쯤에, AWS에서 ACM 인증서를 발급 받고 웹 사이트에 https 접속을 받을 수 있게 되어서 굉장히 뿌듯해 하고 있었습니다. 그리고 이 뿌듯한 마음을 가지고 백 엔드 작업을 룰루랄라 신나게
uhou.tistory.com
나랑 환경은 조금 다른 상황에서 발생하신 오류지만 본인이 생각하신 여러 추측해 대해 정리해주셨다.
내가 팁을 얻은 부분은 여기다.
'하지만 저는 AWS의 로드밸런서를 그저 https연결을 위한 도구로만 사용하였고' 라는 부분에서 아 여기가 문제일 수 있겠다는 생각을 했다.
로드밸런서 문제면 가능성이 있는건 대상그룹인가?
503에러도 결국 대상그룹 문제였기 때문에. 그리고 HTTP로는 정상적인 접근이 가능했기 때문에.
결론은 또 대상그룹에서 발생한 문제였다.
처음 ACM인증부터 로드밸런서까지 HTTPS를 사용하는 과정에 대해 나와 현재 환경이 제일 비슷한 블로그 글들을 찾아 진행했다.
하지만 대상그룹에 대해서는 '로드밸런서에서 대상그룹을 선택해주세요' 나 '없으면 만들고 선택해주시면 됩니다' 정도만 나왔다.
물론 적어주신 분도 있었겠지만 내가 본 글중에는 없었기 때문에.....................
Target Group Protocol이 HTTP 인것 하나 HTTPS 인것 하나 이렇게 두개를 만들었다.
왜?
로드밸런서 Listener에 HTTP와 HTTPS를 추가해야하니까 HTTP Listener 에는 HTTP TargetGroup을 HTTPS Listener 에는 HTTPS Target Group을 넣어야겠다고 생각했으니까...
그리고 그렇게 등록해 생성한 뒤에 Listener 탭을 봤을 때 HTTPS에 SSL 인증서도 제대로 들어가있었기 때문에 아무 의심도 하지 않았었다.
서버 내에서 URL에 8080을 제거 하기 위해 80포트로 들어오면 8080으로 연결하도록 설정했다.
그래서 HTTP를 통한 접속은 제대로 처리 된것이다.
80포트로는 접근할 수 있으니까.
근데 HTTPS를 쓰겠다고 443으로 접근했으니 될리가 있나..?
그래서 HTTPS Listener의 Target Group을 HTTP로 바꿔줬다.
결과는?
당연히 해결....
생각없이 설정하지 말고 생각좀 하자...ㅠㅠ
'Web > AWS' 카테고리의 다른 글
SpringBoot & React AWS 배포 테스트 3) EC2 Instance 생성 후 설정 (0) | 2024.08.02 |
---|---|
SpringBoot & React AWS 배포 테스트 2) RDS MySQL Database Instance 생성 후 Local Workbench와 연결 테스트 및 프로젝트 연결 테스트 (0) | 2024.08.02 |
SpringBoot & React AWS 배포 테스트 1)S3 Bucket 로컬 테스트 (0) | 2024.08.02 |
S3 이미지 파일 처리 (0) | 2024.08.01 |
[AWS Spring boot (Gradle) 연동] 인스턴스 서버 접속 (0) | 2021.11.05 |