아하 REST API 서버 개발 (14)

finallee
aha.official
Published in
7 min readMar 23, 2019

진짜 진짜 정말 무지하게 오랜만이에요 여러분!

늦게와서 죄송합니다

매일같이 머리속에는 강좌를 써야지 써야지를 백번도 더 생각하지만 서비스를 운영하며 매일같이 할 일이 태산같아 처리를 하느라 너무 늦었습니다.

자 우리는 이제까지 실제 서비스에서 쓸 수 있을 정도의 REST API 를 작성해왔고 또, 어느정도 구색까지 맞춘 구조를 설계하였습니다.

하지만 실제 서비스에서 에러가 발생하여 로그로 기록되는 것 외에 다른 조치가 없다면 빠른 대응을 할 수가 없습니다.

그래서 이번 시간에는 실시간으로 에러에 민첩하게 대응할 수 있는 기초 전략에 대해서 썰을 풀어보겠습니다.

Error Log Tracking Solution

실제 서비스를 운영하다보면 다음과 같은 필요가 생기기 시작합니다.

  1. 서버에서 기록된 로그를 보려면 직접 서버에 ssh 로 접속하여 tail -f 혹은 lnav 등으로 로그를 봐야합니다.
  2. 만약 로드밸런서를 붙이게 되면 로그가 분산되기 시작하므로 어떤 인스턴스에서 발생한 에러인지를 직접 찾아야합니다
  3. 무엇보다 실시간 알림 받기 위해서는 다양한 로그 레벨을 설정하여 알림 설정을 따로 구현해야 합니다.

이를 해결하기 위해서는 저렴하지만 위의 필요를 충족시켜줘야 할 패키지 혹은 솔루션을 찾게 되는데요.

여러 솔루션들이 있지만 가장 커뮤니티가 크고 검증되었으며 현재도 많은 서비스들을 지원하고 있는 대표적인 두가지 솔루션이 바로 SentryRollbar 입니다.

어떠한 것들을 사용해도 비슷한 효과를 누릴 수 있으나, 저희 서비스에는 Sentry 가 적용되어 있기 때문에 Sentry 에 대해서 설명드릴 수 있도록 하겠습니다.

Sentrypython 으로 작성된 로그 취합, 분석 및 트래킹 시스템으로 github 에 오픈 소스로 공개 되어있으며 클라우드 서비스도 아래의 링크에서 제공받을 수 있습니다.

Sentry 무료 버전은 10,000개의 이벤트를 제공하고 일주일 분량을 백업본을 제공합니다.

비교적 간단한 서비스에서는 사용자가 수 천 ~ 수 만명까지도 무료로 충분히 사용하실 수 있으니 혜자스러움의 끝을 달리는 좋은 서비스입니다.

Sentry

자 그럼 일단 Sentry 에 가입하신 후 Express 프레임워크를 선택해 주십시오.

그러면 친절하게도 굉장히 친절한 가이드가 나오는데 해당 내용을 숙지하시고 아래와 같이 소스코드를 작성해 보자구요~

src/.env

SENTRY_DSN= 여러분의 DSN 을 추가해주세요 

src/app.js

Sentry 를 이식하였으니 이제 실제로 Sentry 가 잘 작동하는지를 테스트 해 볼 시간입니다.

일단 테스트를 위해서 error.route.js 를 아래와 같이 작성해 보도록 합시다.

src/routes/error.route.js

그리고 Postman 으로 GET 127.0.0.1/v1/error 을 날려보시면 아래와 같이 Sentry 에 에러가 송출되고, 메일로 알림까지 받을 수 있는 것을 확인할 수 있습니다.

메일이다!!
에러 발생!!

그런데 한가지 생각해봐야 할 것이 있습니다.

Sentry 는 물론 굉장히 혜자스러운 솔루션임에는 변함이 없으나, 무한정으로 무료로 사용하는 솔루션은 분명 아닙니다.

그러면 배포까지 많으면 수백 번을 테스트해야 하는 개발 환경에서 그때마다 수도 없이 많은 에러를 모두 Sentry 로 보내버리게 되면, 무료 카운팅을 실제로 사용할 수 없게 되어버립니다.

또한, 개발 환경에서는 바로 콘솔에 찍히는 에러 스택을 보며 디버깅을 하면 되니 배포 환경에서만 작동하도록 처리해주어도 충분합니다.

src/app.js

if (process.env.NODE_ENV === 'production') {
// 에러 핸들링 전 Sentry 로 캡쳐
const sentry = require('@sentry/node')
sentry.init({ dsn: process.env.SENTRY_DSN })
app.use(sentry.Handlers.errorHandler())
}

자 이제 배포 환경에서 에러가 발생하면 이메일로 노티가 오도록 설정하였습니다.

하지만 정신없이 서비스에 집중하다보면 이메일만으로는 충분하지 않을 수 있습니다.

그래서 Slack 등과 같은 메시징 솔루션으로 알림을 줄 수 있는 시스템을 백업차원에서 만드시는 것을 추천드립니다.

Slack Webhook

Node 에서 Slack 웹훅을 사용하시기 위해서는 아래의 패키지를 사용하시면 편하게 연동하실 수 있습니다.

자 그럼 언제나 그렇듯이 패키지를 설치하는 것으로부터 시작해 봅시다.

npm install @slack/client

패키지를 설치하신 후에 Slack 에서 Incoming Webhooks 를 설정해 주시면 아래와 같은 Webhook 링크를 받으실 수 있습니다.

https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXX...

그럼 .env 안에 Webhook 을 추가해주도록 합시다.

.env

SLACK_WEBHOOK=https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXX...

그후에는 역시 app.js 에 아래와 같이 작성해줍시다.

자 이런식으로 작성을 하시게 되면 서버에서 예기치 못한 에러가 발생하였을 경우, 최소한 서버 자체에 Log 를 남기고, Slack으로 에러가 발생했다고 안내하며 Sentry 가 일주일동안 Log 를 기록하고 이메일로도 안내하게 됩니다.

이정도면 어느정도의 트래픽에 도달하기 전까지는 충분히 실시간으로 에러를 대응할 수 있는 기본 시스템을 갖춰진 것 같습니다.

이제 어느정도 배포를 위한 서버를 기초작업은 정말 마무리가 된 것 같습니다.

남은것은 pm2 를 이용해서 서버에 직접 배포하는 부분과 docker 를 입혀서 이미지를 올리는 것 정도가 남은 것 같습니다.

언제가될지는 몰라도 꼭 남은 강좌 들고 다시 찾아뵙겠습니다.

감사합니다.

블록체인의 핵인싸 모스랜드가 아하에서 궁금증을 풀어드리고 있습니다.

일요일까지 질문하시고 10,000AHT 받아가세요^^

회원가입도 해주시면 강좌가 더 빨리 돌아온다는 사실!!!

--

--