v1.5.8 현재 기능 + AWS ELK

barely-works·2020년 4월 4일
0

telegram-bot

목록 보기
6/9

Notice

Fetures

Bitfront Price Alert 라고 이름을 짓고 시작한 Telegram Bot 이었는데 조금은 기능이 확장되었다.

  • Bitfront 거래소로부터 LN, BTC, ETH 의 USD 가격을 1시간에 한번씩 알림
  • Coinbase 거래소로부터 BTC, ETH 의 USD 가격을 1시간에 한번씩 알림
  • Gopax 거래소로부터 BTC, ETH 의 KRW 가격을 1시간에 한번씩 알림
  • Upbit 거래소로부터 BTC, EHT 의 KRW 의 가격을 1시간에 한번씩 알림

매시 00분에 네 거래소의 가격을 하나의 Telegram 알림으로 전송한다.

지인 중에 알림을 원하는 분이 계셔서 한분의 customer(!) 가 있고, 그분께는 기본 기능인 1시간에 하나씩 알림을 보내고 있고 원래의 목적(?)인 가격 변동 폭이 클 때에는 별도 알림을 보내고 있는데, 해당 별도 알림은 나만 받고 있다. 이벤트성 알림 기준은 다음과 같다.

  • LN, ETH, BTC 각각 설정해둔 USD 와 KRW 의 상한가와 하한가가 있어 해당 가격을 벗어나면 알림을 보낸다.
  • LN, ETH, BTC 모두 1분내 가격 변동폭이 10% 이상이 되면 알림을 보낸다.

네 거래소 모두 가격 체크 빈도는 1분에 한번씩 하고 있으며, 바로 이전에 체크한 가격으로부터의 변동폭이 함께 알림으로 간다.

Service Architecture

AWS EC2

  • Free Tier instance 한대에 올라가 있다. 분명히 Free Tier level 에서 신청해서 사용하고 있는데 사용료가 청구되서 문의 메일을 보낸 상태.

Python v3.7.7

  • 최신 Python 가져와서 script 로 만든게 시작이라 Framework 도 없고 아무것도 없다. 각 거래소별 인증 필요 없는 조회 API 들로 가격을 불러와서 계산 및 포맷팅해서 Telegram API 로 보내고 있어서 requests 하나만 설치해서 사용 중.

Docker

  • 크기가 작은 script 지만 dockerize 하여 versioning 하고 있다. 매우 작고 가벼운 Python docker image 가 있어서 (frolvlad/alpine-python3) 해당 image 를 사용 중이다.

  • 개인용 랩탑에서 개발 후 image build & push, ec2 instance 에 ssh 로 접속 후

sudo docker stop $(sudo docker ps -aq) && \
sudo docker rm $(sudo docker ps -aq) && \
sudo docker run -d ******/bitfront-price-alert:v1.5.8 \
&& sudo docker images \
&& sudo docker ps

이런 식으로 띄우고 있다. 그래도 고객님(!) 에게 안정적인(?) 알림을 드리기 위해 매시 55분 ~ 00분 사이에는 배포(!)를 하지 않는 것을 원칙으로 하고 있다. 물론, 그런거 관계없이 막 죽고 그런다. ㅋㅋㅋ

AWS ElasticSearch + Kibana

  • Docker 에서 나오는 로그들을 ELK stack 에 올려서 보고 싶었다. 이전 회사들에서는 DevOps 들이 알아서 셋업을 해줬던지라, STDOUT 으로 로그를 쏘면 거의 실시간으로 Kibana 에서 볼 수 있었어서 해보려고 함.

  • 제대로(?) 하면 어떻게 해야 하나 약간의 조사를 해보니 Docker 에서 STDOUT 으로 나오는 로그들은 해당 instance 의 docker container 에 접근 가능한 shared volume 의 특정 파일에 쓰이고 있고, filebeat 같은 서비스(?)를 사용해서 취합 후 elastic search 로 보내는 것이 좋은 구조 같았다.

  • 위와 같은 셋업을 하면 여러 instance 에 배포를 하더라도 ELK 에 알아서 filter 하기 쉽게 올릴 수 있는데 일단 보기만 하고 셋업을 안 하고 있었음.

  • AWS ElasticSearch 역시 IAM 을 통해 해당 ES 에 접근 가능한 권한을 관리해줘야 하는데, 보통 DevOps 들이 provisioning 을 다 해줘서 내가 띄운 instance 들은 알아서 적절한 권한이 설정되고 스스로 그 설정을 확인 및 변경이 가능했었다. IAM 으로 ES 에 접근 가능한 policy 설정해서 EC2 instance 에 얹어줬는데 생각대로 잘 안되서 일단 방치.

  • 그러다가 제대로 하는 것보다 그냥 되게 하려면 뭐가 빠를까... 해서 AWS ES 에서 접근 권한을 IP-based whitelist 로 변경하고 EC2 instace 의 IP 와 개발하고 있는 IP 를 등록했다. 그리고 양쪽에서 AWS ES/Kibana 접근 가능함을 확인. Docker container 안에서도 접근 잘 되더라.

  • 접근이 해결되고 나서도 ES 관련 library 를 써야하나 보다가... 그냥 curl 로 됐던 기억이 나서 ES API 뒤져보니 그냥 된다. curl 로 해도 되니 requests 로 직접 ES 에 로그를 보내기 시작. 된다. 즉 매번 로깅 할 때마다 ES 에 한번씩 POST 콜 보낸다는 소리 되시겠다. 아직은 매우 작으니까 (...)

  • Kibana 에 index 설정을 안 해주면 아무리 보내도 ES 는 있어도 Kibana 에서는 안 나오는데 예전 회사들에서 써본 기억을 더듬어서 index 설정 완료. 중간에 꼬여서 날리기도 하고 지금도 테스트로 보냈던 데이터가 인덱싱되서 나오는데... 당장 쓰는데 불편 없음.

  • 이걸 왜 ELK 에 묶었나? 물론 문제가 생겼을 때 EC2 에 ssh 로 접근해서 docker logs -f 하는 것보다 있어보이는 것도 있지만 서비스가 죽었을 때 health check 하기가 쉽지 않았던 부분도 있다. Kibana 에 몇분 이상 데이터 안 들어오면 알람보내게 설정 예정.

  • AWS ES 도 Free tier 에 맞춰서 설정했는데 비용 청구가 날아왔다. 그리고 생각보다 비싸다. 일단 문의를 보내놨는데, 사실 별거 하는 것도 없어서 (...) AWS EC2 에 직접 ES + Kibana 설치해서 같은 서버에서 처리해도 사실은 무리가 없다. 다만 두 서비스가 따로 있는게 정석이라 쩜쩜쩜.

Motivation

한달만에 왜 만들기 시작했는지 깜빡했는데, 지난달 코로나와 유가폭락의 여파로 전세계 리세션이 시작되며 주가가 폭락했는데 당시에 코인들도 같이 폭락했었다. LN 이 특정 가격 아래면 사려고 생각중이었는데 순식간에 $2.9 라는 최저점을 찍고 왔는데 그동안 내가 몰랐다. under $4 or $5 정도면 매수하려고 생각했는데 내가 다시 봤을 때는 이미 $5 이상을 회복한 상태. 이런 상태를 방지 할 겸, 그리고 시장에 등락이 심해서 매매를 고려하다보니 자꾸 가격을 확인하게 되서 그냥 알림을 받도록 만듦.

profile
another backend engineer

0개의 댓글