예전에 회사에 필요한 것이 뭐가 있을까 싶어 이것저것 알아보다가 aws상의 자원 정보를 주기적으로 긁어서 유저에게 보여주는 프로그램을 만든 적이 있었다. 처음 프로그램의 구조는 상당히 간단했다. 단순히 php로 이루어진 서버에 http 요청이 오면 그 즉시 aws api를 호출하여 자원 정보를 리스트로 출력해주는 것이었다. 다만 자원의 양이 많으면 응답에 시간이 너무 오래 걸린다는것이 큰 문제였지만. 이걸 해결하기 위해서 파이썬과 boto를 사용해서 정보를 긁어오고 난 후, 이걸 로컬의 memcached에 저장해 놓고, 유저의 요청이 있을 때 memcached에 저장된 결과를 응답으로 주도록 했다. 주기적으로 긁어오도록 하는 것은 그냥 간단하게 해당 스크립트를 crontab에 등록하는 것으로 해결했다.
이번에 이걸 업그레이드할 기회가 생겼다. 차이라면 기존에는 개인적으로 만들었던 것이었는데, 이번에는 회사 차원에서 이걸 조금 더 업그레이드할 수 있지 않느냐 하는 것. 그래서 프론트 개발자와의 의견 교환으로 memcached 대신에 elasticache로, 또 파이썬+boto 대신에 logstash로 변경하기로 했다. 이전에 회사에서 간단하게 ELK 스택에 대해서 발표한 적이 있었는데 그것에 감명을 받았던건지, 아니면 굉장히 흥미가 생겼던지.
어쨌든 새롭게 변경되는 구조를 보면 elasticache는 기존 php로 이루어진 백엔드를 대체하도록, logstash는 기존 스크립트를 대체하는 데몬과 같은 역할을 하도록 한다. elasticsearch는 별다른 설정이 필요가 없었다. 적당히 aws의 자원 별로 어느 정도는 통일된 json을 던지면 알아서 인덱스를 만들고 필요한 응답을 준다. logstash가 문제였다. 여기서 aws의 정보를 어떻게 하면 얻어올 수 있을 것인가?
logstash의 설정은 크게 세 부분, input, filter, output 로 나뉜다. input을 통해 logstash로 들어온 정보는 filter를 사용하여 입맛대로 가공할 수 있다. 가공된 정보는 output을 통해 원하는 곳으로 보낼 수가 있는 것이다. logstash에서 지원하는 input, filter, output의 종류는 굉장히 많아서 아마 원하는 것을 별 문제 없이 선택하여 사용할 수가 있는데, 문제는 input 중에서 aws상의 자원 정보를 얻는 부분이 없다는 것이다. 따라서 이것을 가져오는 input을 따로 구현해야 할 줄 알았고 이게 쉽지 않아 보였는데, input을 구현이라고 하기에 굉장히 민망할 정도로 간단하게 제작할 수 있었다. 방법 자체는 상당히 간단해서, 상속받아 재작성할 클래스에서 register, run 두 개의 함수만 재정의해 사용하면 되는 것이다. 함수 이름에서 알 수 있는 그 역할을 실제로 구현하면 끝이다. 그래서 생각보다 굉장히 빨리 끝낼 수 있었다. 잘 만든 프로그램이란 바로 이런 것을 두고 하는 말일까?
이걸 보니 앞으로는 뭔가 데몬을 작성해서 작업을 처리하도록 하는 것보다 logstash를 사용해서 데몬의 역할을 수행하도록 하는 것이 더 나아 보인다. 일단 플러그인만 간단하게 제작하면 똑같은 역할을 수행하는 데몬을 만든 것이나 다름없고, 기본적으로 지원하는 output이 꽤나 많기 때문에(tcp나 http, 심지어 stdout도 있다.) 아예 플러그인을 제작할 필요가 없을 수도 있다.
예전에 회사에서 어떤 프로젝트를 진행했었는데(빛도 못보고 결국 사라졌다-_-), 거기서 aws의 sqs에 있는 메시지를 가져와 정보를 얻고, s3에 있는 데이터를 가공하는 역할을 하는 데몬을 작성한 적이 있었다. 그때 안정적인 데몬을 만들겠다고 초반에 삽질한 것이 너무나 많았는데 logstash를 사용했다면 어땠을까 하는 생각이 든다. input은 sqs를, output은 api 서버에 http로 응답을 줬다면, 실제 제작해야 하는 부분이 굉장히 작고 간단했을 텐데. 이것 뿐만 아니라 내가 만들고 수정했던 다른 데몬들이나 periodic task등을 전부 이걸로 처리했었다면 어땠을까? 하는 생각도 든다.
logstash… 연구 가치가 꽤 있을 것 같다. java+ruby로 만들어진 것 같은데, 순수 python으로 만들어진 같은 역할을 하는 것은 없을까?