이번에 EAI_AGAIN 에러를 겪으면서 느낀 점은, 트래픽이 많지 않더라도 얼마든지 서버가 내려갈 수 있고, 제대로 세팅을 해놓지 않으면 최악의 경우에는 이를 눈치채지 못할 수도 있다는 점이다.
애초에 서버가 내려가지 않도록 하는게 가장 중요하지만, 항상 정말 예상치 못한 곳에서 문제가 발생하기 때문에 서버가 내려갔을 경우를 항상 대비해야 한다. 이를 위해 존재하는것이 다양한 모니터링 도구들이다.
기존에 나는 pm2를 통해 백엔드 서버 상태를 관리했었다. 도커 내에서 pm2를 통해 서버를 돌리게 되면 pm2 웹사이트에서 모니터링 툴을 제공해준다.
처음에는 이것만 해놓고 상당히 만족하고 있었다. 실시간으로 서버의 상태를 확인할 수 있고, 서버가 내려가면 버튼 눌러서 다시 서버를 재시작할수 있기 때문이다.
그런데...
어느날 다시 들어가보니까 500 에러를 뱉으면서 웹페이지가 로드되지 않았다. 무슨 일인가 싶어 pm2 에 들어가 확인해보았는데 정상적으로 실행중이라고 떠있었다.
실제로 ssh를 통해 인스턴스에 접속하여 상태를 확인하니 프론트서버에서 요청마다 EAI_AGAIN 에러를 뱉고 있었다. 백엔드서버에는 아무 문제가 없었기에 pm2는 조용했다. 즉 모니터링 툴이 전혀 쓸모가 없었던 것이다.
그래서 생각한 점은 주기적으로 서버에 요청을 보내어 상태를 확인하고, 문제가 발생하면 바로 알림을 보내주는 환경이 필요했다. 대응을 어떻게 할지는 둘째치고 문제가 발생하면 빠르게 알 수 있도록 피드백이 필요한 것이다.
Node환경에서 어떤 툴을 사용할지 고민했는데, 오직 Github 환경에만 의존하는 오픈소스인 UpptimeJS를 찾을 수 있었다.
해당 오픈소스는 Github Actions를 통해 서버를 모니터링하고, 이슈가 생기면 Github Issue 를 통해 보고하며, 기본적으로 Github Pages 를 통해 대쉬보드를 제공한다. Github의 서비스들을 정말 백분 활용한 오픈소스라고 할 수 있겠다.
먼저 Template 형태의 Upptime을 가져와야 한다.
https://github.com/upptime/upptime
가져올때 이름은 아무렇게나 해도 되고, 공개 여부는 Public으로 하면 무료이다. Private 로 하면 Github Actions의 무료 빌드 시간 제한(매월 2000분)이 걸린다. 그리고 Include all branches 옵션을 주어야 한다.
템플릿을 가져왔다면 가장 먼저 할 일은 이곳(Github 우측 상단 프로필 -> Settings -> Developer Settings -> Personal Access Tokens)에 들어가서 토큰을 발급받아야 한다.
이름은 아무거나 하면 되고, 만료기간과 권한을 주면 된다. 필요한 권한은 repo 와 workflow 이다.
토큰을 만들었다면 해당 토큰을 Upptime 레포지토리의 Secrets 로 등록해야 한다. 이름은 꼭 GH_PAT 으로 하고 토큰을 등록해준다.
이제 .upptimerc.yml을 수정해준다. 로컬에 pull 할 필요는 없고 그냥 연필모양 아이콘을 눌러 수정해준다.
- owner: 레포지토리를 소유한 유저명 혹은 조직명
- repo: 레포지토리 이름
- sites: 모니터링 할 사이트들
- status-website: 대쉬보드 웹사이트 설정
위 4개가 핵심적인 옵션이다. status-website에는 따로 대쉬보드로 사용하고싶은 도메인이 있다면 cname 레코드를 입력해주면 된다. 아니면 그냥 cname 옵션을 지우고 baseUrl 에다가 /{레포지토리명} 을 써주면 Github Pages를 사용하게 된다.
나는 내가 만든 웹 서비스들을 한번에 보고 싶어서 특정 웹 서비스의 도메인보다는 그냥 깃허브 페이지를 이용하기로 했다. 따라서 상단과 같이 세팅했다.
이렇게 수정하고 커밋하면 자동으로 Actions가 돌아가면서 Status가 갱신된다. 기본적으로 README에 현재 상태가 출력되고, 따로 웹사이트에 들어가도 상태가 표시된다.
이제 서버가 내려가거나 문제가 생기면 알림을 받을 수 있도록 해야 한다. Upptime에서는 알림을 제공하기 위한 다양한 Provider를 제공하는데, Slack과 Discord, Email, SMS 등이 있다.
나는 개인 Slack에 이를 연결해두기로 했다. Slack과 연동하는법은 아주 간단하다.
슬랙 채널에서 webhook을 검색하여 설치하고 웹훅 URL을 기억해둔다.
그리고 Upptime Repository로 돌아가서 Secrets 3개를 추가한다.
- NOTIFICATION_SLACK -> true
- NOTIFICATION_SLACK_WEBHOOK -> true
- NOTIFICATION_SLACK_WEBHOOK_URL -> 슬랙 웹훅 URL
이러면 끝이다. 이제 서버가 내려가거나 다시 올라가면 슬랙에 자동으로 메시지가 온다.
이렇게 해서 간단하게라도 모니터링 툴을 도입하고 서버가 내려가면 알림을 받을 수 있도록 설정했다. 이제 모종의 이유로 서버가 내려갔을 때(내가 고칠 수 있을지는 둘째치고) 바로 문제를 인식하고 대응할수 있을 것이다!
'Projects > NPE' 카테고리의 다른 글
TypeDI를 통한 의존관계 주입과 관심사의 분리 (0) | 2021.11.29 |
---|---|
[GraphQL] Typescript+GraphQl+TypeORM 프로젝트에 TypeGraphQL 적용하기 (0) | 2021.11.08 |
[TypeORM] 쿼리빌더를 통해 데이터 가져오기 (0) | 2021.11.07 |
댓글