끄적이는 보송

[AWS] CloudWatch를 이용한 Billing 알람 설정하기 본문

STUDY/AWS

[AWS] CloudWatch를 이용한 Billing 알람 설정하기

끄적이는 보송 2023. 2. 8. 12:03
반응형

개요

AWS 계정 탈취나 침입자에 의해 비정상적인 서비스 이용으로 빌링이 말도 안 되게 나오는 경우를 종종 듣는다. 이것을 예방하기 위해 여러 수단이 있다. 오늘은 하루 단위로 특정 비용 이상으로 비정상적인 과금이 탐지됐을 때 CloudWatch와 SNS 서비스를 통해 이메일로 알람을 보내도록 설정하는 포스팅을 다루려 한다.

 

요구사항

- 하루에 100 USD 이상 과금되는지 탐지하고 싶음.
- 100 USD 이상 과금이 발생하면 이메일로 알람 전송받고 싶음.
- 가능한 빠르게 알람을 받고 싶음.

 

사전작업

먼저 빌링 대시보드에 접근해 'Billing preference' > 'Receive Billing Alerts'를 클릭해 활성화해줘야 한다. 이것이 활성화돼야 알람 설정에 이용할 CloudWatch의 'EstimatedCharges' 지표가 생성된다. 참고로 이 옵션은 한번 활성화하면 되돌릴 수 없으며 Root 사용자에서 수행해야 한다.

 

 

실습 (CloudWatch 지표 및 조건 설정)

먼저 CloudWatch 콘솔환경으로 넘어간다. Region은 버지니아 북부를 선택한다. 빌링 관련은 버지니아 리전에서 다루기 때문이다. 빌링 외에도 좀 글로벌하다 싶은 서비스는 앵간해선 버지니아에서 확인한다. CloudWatch 콘솔화면 좌측 패널에 'All alarams' ghrdms 'Billing'을 선택해 'Create alarm'으로 접근해 준다.

알람을 탐지할 지표를 먼저 정의해야 한다. 'Select metric'을 클릭하자.

CloudWatch 지표가 출력되는데, 'EstimatedCharges' 지표를 통해 해당 계정이 어느 정도 과금이 청구되는지를  알 수 있다. 매달 과금량이 점진적으로 우상향 했다가, 다음 달로 넘어가면 0으로 시작하는 것을 볼 수 있다. 참고로 'EstimatedCharges' 지표는 6시간마다 찍히며 이것이 최선이다. 그 이하의 값으로는 탐지할 수 없다. 하지만 우리가 알람 설정을 위해 참조할 지표는 다른 것이다.

우리는 Custom Metric을 생성해 줘서 이것을 기반으로 알람을 설정할 것이다. 앞서 말했듯이 하루에 100 USD이상 사용하하면 알람을 울리도록 하려고 한다. 현재 지점과 이점 지점의 차이점을 계산하면 하루에 100 USD 이상이 과금되는지를 판별할 수 있을 것이다. 나의 경우, 'DIFF' 함수를 이용했다. 'DIFF' 함수는 전 지표값과 현 지표값의 차이점을 보여주는 함수다.

DIFF(m1) 함수를 기입해 확인해 보니 이전 지점과 현재 지점의 차이 값이 출력되는 그래프가 생성되었다. DIFF 함수로 생성된 그래프는 수평선을 그리고 있으며, 비슷한 수준의 과금이 유지되었음을 의미한다. 만약 비이상적인 서비스 생성으로 과한 과금이 발생하면 그래프에 스파이크가 튀었을 것이다.

우리가 알람 생성에 참고할 지표가 이 DIFF 함수 지표다. 이것만 선택하고 'Select metric'을 클릭하여 다음으로 넘어가자.

앞서 말했듯이 'EstimatedCharges' 지표는 6시간마다 찍힌다. 즉, 하루에 4번 찍힌다는 것이다(정확히는 그렇지 않지만 일단 넘어가자). 그렇기에 하루에 100 USD 과금을 기준으로 삼았다면 이를 4로 나누어 25달러를 입력해야 한다. 이해를 돕기 위해 각 시간별로 과금량을 나누어보았다. 실제로는 이렇게 알맞게 나뉘지 않는다.

00:00 ~ 06:00 간 과금량 25 USD
06:00 ~ 12:00 간 과금량 25 USD
12:00 ~ 18:00 간 과금량 25 USD
18:00 ~ 24:00 간 과금량 25 USD
00:00 ~ 24:00 간 총 과금량 100 USD

'EstimatedCharges' 지표를 자세히 보면 누락된 데이터가 있다. 나의 경우, 누락된 데이터 때문에 쓸데없는 알람 발생을 방지하기 위해 누락 데이터는 무시 처리를 하고 두 개의 데이터 포인터 중 하나라도 조건을 만족하면 알람을 발생하도록 설정했다(1 out of 1 처리해도 상관없다). 'EstimatedCharges'의 누락되어 '보이는' 그래프 관련하여 아래 링크의 포스팅을 참고 바란다.
[+] https://bosungtea9416.tistory.com/entry/AWS-CloudWatch-%EB%88%84%EB%9D%BD%EB%90%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8F%AC%EC%9D%B8%ED%8A%B8-Sample-Count%EB%A1%9C-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0

반응형

실습(Email 주소로 알람을 보내기 위한 SNS 설정)

지표와 조건 설정을 완료했다면, 알람을 어떻게 보낼 것인지 설정해줘야 한다. 'Add notification'을 클릭해 준다.

이전에 설정한 조건값보다 지표가 웃돌면 SNS 서비스를 통해 지정한 이메일 주소로 알람을 보내도록 설정해 주는 것이다. 이미 생성한 SNS Topic이 있다면 'Select an existing SNS topic'을, 만약 없다면 'Create new topic'을 선택하여 Topic 이름과 이메일 주소를 넣어준다. 이메일 주소는 콤마(,)를 이용해 한번에 여러 이메일 주소를 정의할 수 있다. 끝났다면 'Create topic'을 클릭해 다음으로 넘어간다.

알람 이름을 기입한다. 그냥 디폴트로 넘어가도 필요한 정보는 알람에 전부 담아준다. 'Next'를 클릭해 설정값을 검토하고 생성을 마치면 그거로 1차 작업은 끝이다.

CloudWatch에서 알람 생성을 완료했다면 SNS 서비스로 넘어가 보자. SNS에 생성된 Topic이 보일 것이다.

SNS Topic에 내가 기입한 이메일주소가 보인다. 이메일 주소를 선택하고 'Request confirmation' 클릭하면 알람 활성화 메일이 보내질 것이다. 

만약 아래와 같은 이메일을 받지 못했다면 스팸메일을 확인해 보자. 아래 'Confirm subscription' 클릭해 콘솔환경에서 직접 알람을 받도록 설정할 수도 있다. 반대로 저 링크를 통해 알람을 받지 않도록 unsubscribe도 가능하다.

추가로 Request confirmation 옆에 있는 'Confirm subscription' 버튼은 콘솔 환경에서 직접 url을 기입해 활성화해 주는 방법이다. 'Confirm subscription' 클릭했을 때 이동하는 url 값을 넣어주면 된다.

정상적으로 작업을 마쳤다면 아래와 같이 Confirmed 상태가 된다. 만약 해당 메일이 보이지 않는다면 스팸메일을 확인해 보자. 이때부터 알람을 받을 수 있게 된다.

[+]https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Statistics-definitions.html
[+]https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html
[+]https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/gs_monitor_estimated_charges_with_cloudwatch.html

반응형
Comments