brunch

You can make anything
by writing

C.S.Lewis

by 강진우 Aug 06. 2019

CloudWatch 메트릭 그래프 스냅샷 만들기

Amazon Web Service

이번 글에서는 콘솔을 통해 CloudWatch 메트릭 그래프 만들고 AWS SDK를 활용하여 해당 그래프를 CloudWatch 콘솔이 아닌 외부에서 볼 수 있도록 스냅샷을 만드는 과정을 살펴보겠습니다. 이렇게 CloudWatch 메트릭 그래프를 스냅샷으로 만들면 슬랙과 연동해서 실시간으로 서비스의 주요 지표를 확인할 수 있는 봇을 만들 수도 있습니다. 

CloudWatch 메트릭 그래프 스냅샷 시스템

위 그림은 저희 회사에서 사용하고 있는 주요 지표 실시간 확인 슬랙 봇입니다. 슬랙 봇을 통해 특정 커맨드를 날리면 슬랙 봇은 API Gateway 뒤에 있는 Lambda 함수를 실행하고 Lambda 함수는 CloudWatch로부터  메트릭 그래프의 스냅샷을 받아 옵니다. 그리고 이렇게 생성된 이미지 데이터를 슬랙 파일 업로드 API를 통해 채널에 업로드하게 됩니다. 이 중 오늘 다룰 이야기는 Lambda와 CloudWatch 사이의 구간입니다. 그럼 먼저 CloudWatch 메트릭에 대해서 살펴보겠습니다.


CloudWatch 메트릭


CloudWatchAWS의 다양한 구성 요소들 (ALB, Elasticache, EC2 등등)의 성능 정보와 관련된 메트릭을 가지고 있습니다.

CloudWatch는 메트릭 외에도 로그도 수집해서 제공하고 있습니다. 이는 CloudWatch Logs라고 합니다.

CloudWatch는 아래 그림처럼 사용자의 필요에 의해 직접 메트릭을 생성하고 CloudWatch로 보내서 저장하고 메트릭을 시각화할 수 있는 인터페이스를 제공합니다. InfluxDBGrafana가 하나로 합쳐졌다고 이해하면 편합니다. 그리고 ALB와 ElastiCache, DynamoDB 등과 같은 AWS 컴포넌트들에 대해 AWS에서 제공해 주는 기본 메트릭이 있습니다.

CloudWatch 첫 화면

이 중에서 ALB로 유입되는 요청의 수가 얼마나 되는지 시각화해 보겠습니다.

ApplicationELB > Per AppELB Metrics를 클릭하면 아래와 같이 현재 사용 중인 ALB의 정보와 수집되고 있는 메트릭들이 보이게 됩니다.

ALB에서 확인 가능한 메트릭들

이 중에 RequestCount를 클릭해 보겠습니다.

RequestCount

하지만 상단에 그려진 그래프의 수치가 이상 합니다. RequestCount는 요청 수인데, 왜 1보다 작은 소수점의 값들이 보일까요? 그래프를 Average로 그려서 그렇습니다. RequestCount는 말 그대로 요청이 들어온 수이기 때문에 Sum으로 바꿔줘야 합니다. Graphed metrics 탭을 누르고 Statistic을 Average에서 Sum으로 바꿔 줍니다.

Statistic 변경

그럼 이제 정상적으로 그래프가 보이는 것을 볼 수 있습니다. 그리고 오늘 글의 핵심 Source 탭을 클릭해 보겠습니다.

Source 탭

위 그림에서 보이는 JSON 형태의 Source 탭 값이 오늘 글에서 가장 중요한 부분입니다. 

바로 AWS SDK를 통해서 메트릭 그래프에 대한 스냅샷을 요청할 때 저 값을 그대로 넘겨줍니다. 

그럼 이제 AWS SDK를 통해서 스냅샷을 가져와 보겠습니다.


메트릭 스냅샷 가져오기


메트릭 스냅샷을 가져오는 부분은 실제 사용 중인 Lambda 함수의 일부분을 통해 살펴보겠습니다.

먼저 boto3를 통해 CloudWatch 인스턴스를 만들어 줍니다.

cloudwatch 인스턴스 생성

위에서 언급했던 메트릭의 Source 탭에 있는 JSON을 정의하는 방법에는 여러 가지가 있겠지만 그리려고 하는 메트릭이 두 개 이상일 경우에는 각각의 Source 값을 배열로 선언해서 사용하는 것이 편합니다. 그리려고 하는 메트릭이 추가되거나 변경될 경우 배열에서 해당 값을 추가 혹은 수정해 주면 되기 때문입니다.

Metric Source 값들

그리고 해당 배열의 값들을 하나씩 꺼내서 get_metric_widget_image()를 호출해 줍니다. 

get_metric_widget_image() 호출

get_metric_widget_image() 함수는 JSON으로 만들어져 있는 메트릭 정보를 바탕으로 JSON 형태의 응답을 돌려줍니다. 

이 응답 중 MetricWidgetImage 필드의 내용이 PNG 형태의 이미지 데이터입니다. 즉 해당 필드의 값 자체가 이미지 그 자체입니다. 

이 값을 그대로 슬랙의 파일 업로드 API를 통해서 파일 업로드의 형태로 전달합니다.

아래는 봇을 통해 전달받은 스냅샷 이미지 데이터 파일입니다.

실제 슬랙 봇의 응답 화면

서비스의 사용량이 급증하거나 외부에서 특정 지표에 대해 확인하고 싶을 경우 이렇게 슬랙 봇과 연동하여 CloudWatch 메트릭의 실시간 스냅샷을 볼 수 있습니다.


마치며


이번 글에서는 CloudWatch 메트릭을 시각화하는 방법과 만들어진 시각화 데이터를 AWS SDK를 통해 실시간으로 가져오는 방법에 대해서 살펴봤습니다. CloudWatch는 기본으로 제공하는 메트릭 외에도 사용자의 필요에 의해 커스텀 메트릭을 저장하고 시각화할 수 있는 기능을 제공해 줍니다. AWS SDK와의 연동을 통해서 어디서든 필요한 데이터를 볼 수 있는 시스템을 구축하시기 바랍니다.


참고자료


AWS 공식 자료 : https://aws.amazon.com/ko/blogs/devops/building-an-amazon-cloudwatch-dashboard-outside-of-the-aws-management-console/


파이썬을 통해서 슬랙 봇을 만들 때 도움이 되는 사이트 : https://renzo.lucioni.xyz/serverless-slash-commands-with-python/


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari