글 읽기 전 주의사항
•
이 글은 unhealty 문제에 대해 명쾌하게 답을 내리진 않습니다.
•
글쓴이는 이런 식으로 삽질해보았다, 이런 식으로 삽질 접근해볼 수 있겠다 정도의 인사이트를 제공하는 글입니다.
CD 적용 시 발생한 로드밸런서 대상그룹 unhealthy 문제(with 간헐적 502 에러)
•
로컬에선 잘 동작하는데, 배포 서버에서만 간헐적으로 502 에러가 뜨는 문제가 발생하는 것이기에 docker container 혹은 https를 적용하면서 사용한 로드밸런서가 문제인 거 같다고 생각했다.
•
문제가 되는 부분을 찾았따. Health checks failed with these codes: [401]
첫 번째, Health checks failed with these codes [401] 해결
배경
사실 이 문제는 3월 9일에 발견했는데, 막상 만든 개발 서버를 그동안 사용할 일이 없었어서 잠시 눈 가리고 방치해뒀었다. 만에 하나 해당 서버를 사용할 일이 앞으로도 쭉 없더라도 해결하지 않고 넘어가면 너무 찝찝할 거 같아 오늘 날을 잡고 해결하기로 했다!
위 사진처럼 로드밸런싱 대상그룹이 unhealty가 뜨고… 배포 서버에서 502 에러가 뜬다,, 제 인스턴스 왜 건강하지 못한 걸까요….. 원인이 다양한 거 같아서 살짝 겁나지만 찾아보자!
실제 해결 과정
•
Sol1) 실패 - 리스너 규칙 변경
◦
공식 문서와 ChatGPT의 답변을 보고서, 리스너 규칙에서 사용자 인증을 필요하다 택했던 기억이 언뜻 나는 거 같았다.
◦
일단 이전에 리스너 규칙 생성했던 TIL을 다시 읽어보자. 정리해 놔서 다행이다!
▪
◦
이번에도 공식 문서에서 알려주는 대로 규칙을 편집하려 시도했다.
1.
aws - ec2 - load balancers - 리스너 탭 - 프로토콜: 포트 선택
2.
규칙 탭 - 규칙 관리 선택
3.
더하기(+) 선택해 Insert Rule 아이콘 추가
4.
방금 추가한 Insert Rule 아이콘 중 하나 선택
5.
조건 추가
6.
save 선택
▪
는 실패. 인증 관련한 설정 변경하는 게 안보인다.
•
Sol2) 성공 - 권한 설정
◦
http 프로토콜로 30초에 한번씩 root url에 get query 날리고 있는데, root url에서 get요청시 권한이 없기 때문에 401 error이 뜨는 것이란 포스팅을 봤다.
◦
관련한 포스팅이 이거 한 개 뿐이었는데, 다시 읽어보니 해결책이 될 거 같았다,, 왜 이전의 나는 이걸 보고 넘겼을까,,,ㅋㅋㅋㅋ
◦
하고, 유심히 우리 팀 코드를 보니 요런 녀석이 있었다.
package com.sptp.backend.common.controller;
import com.sptp.backend.aop.annotation.NoLogging;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class StatusCheckController {
@GetMapping("/health-check")
@NoLogging
public ResponseEntity<Void> checkHealthStatus() {
return new ResponseEntity<>(HttpStatus.OK);
}
}
YAML
복사
◦
EC2 > 대상 그룹 > 그룹 선택 > health check 탭 > Edit health check settings 클릭
▪
health-check path를 root url(/)에서 우리 프로젝트의 health check url인 /health-check 로 바꿔준다. 해당 url은 스프링 시큐리티에서 permit all 설정을 해놨기에 인증 없이 접근 가능하다,,,,,
▪
만일 우리 프로젝트와 같은 코드가 없다면, root url(/)을 스프링 시큐리티에서 permit all해주면 해결 가능하다.
▪
https 배포 과정에서 발생한 에러라 많이 쫄았었는데, 단순 권한 설정과 관련된 정말 허무할 정도로 간단한 문제였다,,,,, 하지만 해결되어 정말 뿌듯하다! 포기하지 않고 다시 도전해보길 잘했다!
▪
다행히 하나는 해결되었지만 여전히 하나는 unhealthy가 뜬다. 또 원인을 찾아보자! 휴 그래도 하나 해결된 덕에 이제 502는 안뜬다!
두 번째, Health chcks failed 해결
실제 해결 과정
•
Register targets에서 443 port를 지워줘서 해결해줬다.