Bitfront Price Alert 라고 이름을 짓고 시작한 Telegram Bot 이었는데 조금은 기능이 확장되었다.
매시 00분에 네 거래소의 가격을 하나의 Telegram 알림으로 전송한다.
지인 중에 알림을 원하는 분이 계셔서 한분의 customer(!) 가 있고, 그분께는 기본 기능인 1시간에 하나씩 알림을 보내고 있고 원래의 목적(?)인 가격 변동 폭이 클 때에는 별도 알림을 보내고 있는데, 해당 별도 알림은 나만 받고 있다. 이벤트성 알림 기준은 다음과 같다.
네 거래소 모두 가격 체크 빈도는 1분에 한번씩 하고 있으며, 바로 이전에 체크한 가격으로부터의 변동폭이 함께 알림으로 간다.
크기가 작은 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분 사이에는 배포(!)를 하지 않는 것을 원칙으로 하고 있다. 물론, 그런거 관계없이 막 죽고 그런다. ㅋㅋㅋ
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 설치해서 같은 서버에서 처리해도 사실은 무리가 없다. 다만 두 서비스가 따로 있는게 정석이라 쩜쩜쩜.
한달만에 왜 만들기 시작했는지 깜빡했는데, 지난달 코로나와 유가폭락의 여파로 전세계 리세션이 시작되며 주가가 폭락했는데 당시에 코인들도 같이 폭락했었다. LN 이 특정 가격 아래면 사려고 생각중이었는데 순식간에 $2.9 라는 최저점을 찍고 왔는데 그동안 내가 몰랐다. under $4 or $5 정도면 매수하려고 생각했는데 내가 다시 봤을 때는 이미 $5 이상을 회복한 상태. 이런 상태를 방지 할 겸, 그리고 시장에 등락이 심해서 매매를 고려하다보니 자꾸 가격을 확인하게 되서 그냥 알림을 받도록 만듦.