실제 서비스 되어지고 있는 어플리케이션을 운영하다보면 여러가지 유형의 로그가 발생한다.
예를 들면
- 어플리케이션 에러로그
- 어플리케이션 접속로드 ( access log )
- 결제 로그
- 클라이언트의 개인정보가 포함된 로그
- 등등..
이렇게 많은 종류의 로그들이 발생하는 만큼.. 모두 한 곳에서 관리하고 한 곳에서 모니터링 하면 좋겠지만..
각각의 로그 성격에 따라 그렇게 할 수 없는 경우 가 많았다. 마찬가지로 몇가지 예를 들면
결제로그나 개인정보가 포함된 로그 같은 경우는 개인정보보호법에 의해서 로그를 마스킹해서 그 로그를 취급할 수 있는 자들만 접근이 가능한 곳에 보관해야 했고,
하루에도 몇십 몇백건씩 올라오는 에러로그는 매번 모든 로그를 다 볼 수 없으니 각종 심각성에 따라 직접적으로 노티를 바로 받아야 하는 경우도 있었다.
그래서 로그를 상황에 따라 효율적으로 수집하고 원하는 곳으로 내보내기 위해서 로그 수집 솔루션
을 도입하기로 생각했고
결론적으로 Fluentd
라는 도구를 개인프로젝트에 도입했고 그 내용을 간략히 소개해보고자 한다.
상황
- 해당 서비스는 k8s에서 서빙되어 지고 있고 특정 pod에 있는
Application1 (아래 사진 참고)
이라는 컨테이너에서 발생한 로그만 수집하고 싶은 상황 Application1
에서 발생하는 로그는 2종류다.- 개인정보가 포함된로그
- 어플리케이션 에러로그
appl
- 모든 에러로그는 모니터링 및 분석하기 쉽게 stackdriver에 쌓는다. 하지만 error level 이 제일 높은 경우에만 직접 slack으로 노티를 받는다.
- 개인정보가 포함된 로그는 마스킹해서 개인정보를 취급할 수 있는 사람들만 접근이 가능한 버킷에 저장한다.
구성도
구성도 이미지 화살표에 붙어있는 순번 기준으로 설명하겠습니다.
- application1 에서 발생하는 로그를 fluentd가 읽어들인다.
- 해당 어플리케이션의 로그들은 모두
.log
형식의 file로써 남기 때문에 fluentd는 로그를tail
한다.
- 해당 어플리케이션의 로그들은 모두
- 그 로그 중 개인정보가 포함된 로그는 aws 키네시스 데이터 스트림으로 보낸다.
- 키네시스는 aws에서 제공하는 실시간 데이터 처리 스트림이라고 생각하면 된다.
- 키네시스 데이터 스트림에 데이터를 쌓기 위해서는 https 로 데이터를 보내야 한다. fluentd는 이 역할을 해주는 plugin이 존재한다. 얼마전 부터 공식 플러그인이 되었고 이를 사용하기 싫다면 직접 커스텀 플러그인을 만들어도 된다. https://github.com/awslabs/aws-fluent-plugin-kinesis
- 실제로는 데이터 스트림에 있는 데이터를 꺼내서 s3로 보내기 위해 키네시스 컨슈머 어플리케이션을 람다로 만들어야 하지만 키네시스 FireHose를 사용하면 바로 S3로 데이터를 보낼 수 있다. 로그 → 데이터 스트림 → 전송 스트림 (FireHose) → S3
- S3 해당 버킷의 접근 권한은 철저히 관리한다 / aws console 자체도 분리해서 관리한다.
- error log는 모두 스택드라이버로 보낸다. 하지만 정말 치명적인 error 로그만 slack으로 바로 노티한다.
- 마찬가지로 fluentd to slack 에 대한 공식 plugin이 존재한다. https://github.com/sowawa/fluent-plugin-slack
- stack driver도 마찬가지로 plugin이 존재한다. (아직까지 공식 plugin은 아니다) https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud
Comments powered by Disqus.