전체 보기
🔵

로드밸런서 대상그룹 unhealthy 삽질기(with 권한설정)

작성일자
2023/03/20
태그
INFRA
프로젝트
Atties
책 종류
1 more property
글 읽기 전 주의사항
이 글은 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를 지워줘서 해결해줬다.