AWS CloudWatch

CloudWatch는 기능적으로 참 훌륭한 툴이다.
UX적으로는 정말 별로다. 지표 좀만 늘어나고 수식이 좀만 추가되면 버벅거리기 시작한다. 나는 CloudWatch Dashboard에서 정말 많은 작업과 분석을 시도하는데, 솔직히 행 위젯이 10개만 넘어가도 업무 지연이 체감될 정도로 발생하는 것 같다.
근데 납득은 간다. 웹 요청으로 지표들을 가져오고, 그것들을 웹상에서 다 계산하고 렌더링까지... 구조적으로 그럴 수밖에 없는 것이다. 근데 어찌하랴. 내가 겪는 UX와 그로 인한 스트레스도 발생할 수밖에 없는 거니까. 결론은 뭐냐. CloudWatch의 UX는 구데기다.
각설하고..
CloudWatch에는 경보 기능이 존재하는데, CloudWatch에 기록되는 Metric들이 어떤 임계치에 도달했을 때 경보를 발생시키고 다른 AWS 서비스로 전송한다. 해당 AWS 서비스에서는 경보가 활성화되었을 때 사용자가 설정한 프로세스를 실행한다. 혹은 AWS 외부 자체 시스템에서 경보 데이터를 불러와 그에 따른 프로세스를 진행할 수도 있다.
CloudWatch의 존재로 인하여 AWS 인프라를 이용하는 기업의 DevOps 수준은 엄청나게 향상된다.
AWS 서비스 중에서 AWS ECS(Elastic Container Service)라는 것이 있다. 어떤 기능인지는 공식 사이트를 참조하시길.


ECS는 컨테이너를 컴퓨팅 리소스(Fargate)에 자동으로 배포해준다.
ECS에는 CloudWatch의 경보에 기반하여 작업의 수를 줄이거나 늘릴 수 있다.
그리고 CloudWatch에서는 AnomalyDetection 기능을 제공한다. 어떤 Metric이나 Expression에 대해 이상탐지를 진행하고, 이상 데이터 여부를 경보로 제공해준다.
그래서 이상 탐지 경보를 만들어 ECS에 적용을 해볼 수 있을까????? 하여 시도해보았더니!
안되더라. 솔직히 왜 안되게 했는지 전혀 납득이 안된다. 왜지? 2021.12 기준 ECS 콘솔에서는 무조건 경보를 설정하고 임계값을 지정해야 한다. 막 어찌저찌 만져보니까 콘솔에서 AnomalyDetection을 스케일링 경보로 사용할 수 없다고 에러가 뜨더라. CloudWatch의 이상탐지 경보는 Boolean 데이터만 제공하도록 되어 있는 건가..?
Anomaly Detection 구현
사실 너무 간단하다. CloudWatch에서 제공하는 이상탐지 기능은 표준 편차를 이용한 것이다. 이상탐지의 대상 시계열 데이터의 Id를 "x"라고 해보자
- "std"라는 Id의 수식을 만들고 표현식은 "TIME_SERIES(STDDEV(x))"로 한다.
- "threshold"라는 Id의 수식을 만들고 표현식은 "TIME_SERIES(AVG(x)) + 2 * std"로 한다.
- "over"라는 Id의 수식을 만들고 표현식은 "(x-threshold)*(x>threshold)/std"로 한다.
일단, 표준편차 기반의 이상탐지는 기존 데이터들의 표준편차를 계산하여 "정상 데이터의 범위"를 계산한다. 데이터가 정규분포라고 가정했을 때 거의 모든 데이터는 안에 있다는 6-Sigma 이론을 들어보았을 것이다. 비슷한 느낌이다.
이 경우에는 평균에서 표준편차의 2배를 더한 값을 임계치로 설정하였다. 해당 임계치를 초과할 경우 over 값이 0을 초과한다. 단순히 임계치와의 편차를 사용하지는 않았고 이를 다시 std로 나누었다. 이렇게 해두면 절대값에 무관하게 이상탐지를 더 효과적으로 사용할 수 있다.
예를 들어 over값이 0을 초과하면 1단계 이상 상태이고, 1을 초과하면 2단계, 2를 초과하면 3단계 이상 상태로 간주하고 서로 다른 액션을 실행할 수도 있다.
그리고 경보는 over가 0을 초과했을 때로 설정하면 이상탐지 경보를 구현한 것이다. 해당 경보가 활성화되었을 때 over값을 불러와 그것이 어느 정도 수준의 이상함인지를 파악하여 다른 프로세스를 실행하면 된다. 단순히 대응 프로세스의 configuration에서 값들을 조절하는 형태가 될 수도 있다.
더 좋은 이상탐지?
더 제대로된 AnomalyDetection을 적용하고자 한다면 AWS Forecast를 활용해보자. CloudWatch에서 Lambda로 지표를 ETL한 뒤 S3에 저장, Glue에서 처리하고 이를 Forecast로 보내 예측 및 이상탐지를 실행하는 것이다!
...그렇게까지 할 바에는 나는 그냥 EC2 하나 띄워서 하는 게 나을지도 모르겠다는 생각이 들기도 한다. 간단한 예측/이상탐지 모델은 빠르게 만들 수 있으니까..