AWS 청구 비용을 Slack으로 받아보는 방법과 구현 패턴

2021.11.05

들어가며

안녕하세요 MAD 사업부 엔지니어 임홍기입니다.
클라우드 서비스가 다양한 곳에서 활용되기 시작하면서 비교적 자료가 많은 AWS에 입문하시는 분들이 많아졌다고 부쩍 느끼고 있는데요

AWS 서비스를 이용하면서 프리티어가 아닌 서비스를 사용하거나 사용 후 리소스를 삭제하지 않는 등의 예상치 못한 비용이 청구되어 곤란하신 분들도 계시리라 생각됩니다.
(저도 테스트를 위해 각종 리소스를 생성하였다가 삭제하지 않은 체 방치해두어 예상치 못한 비용이 청구된 적이 있습니다ㅠㅠ)

그런 여러분들에게 이번 포스트에서 소개해 드리고자 하는 것은 AWS의 요금(청구 비용)을 통지받아보는 서비스를 구현해보는 것입니다.

여러 구현패턴이 있다고 생각합니다만 청구 비용의 통지 방법으로서
1. 프로그래밍 방식으로 통지하는 방법
2. 일정 예산을 바탕으로 한 통지 방법

위의 두 가지의 패턴을 소개해 드리고자 합니다.

프로그래밍 방식으로 통지하는 방법

먼저 서버리스 컴퓨팅 서비스인 Lambda를 이용한 프로그래밍 방식입니다.

아키텍처

이번에 제가 구현한 아키텍처는 다음과 같습니다.

아키텍처

AWS SDK를 이용해서 Cost Explorer에서 리소스의 사용 비용을 구해 Slack으로 통지하는 Lambda를 하나 작성합니다.
그리고 작성된 Lambda를 정기적으로 트리거할 AWS EventBridge를 구성하는 간단한 구조입니다.

구현하기

Incoming Webhook 설정

먼저 Slack에 메세지를 보내기 위해서는 Slack의 Incoming Webhook을 설정할 필요가 있습니다.

인커밍웹훅설정0

채널 채팅창에 /add apps를 입력한 다음

인커밍웹훅설정1
정기적으로 요금 정보를 받아볼 채널에 앱 검색을 통해 Incoming Webhook 이라는 앱을 하나 추가해줍니다.

인커밍웹훅설정2
추가하게 되면 Slack에 추가할 수 있는 페이지로 이동하게 됩니다. Add to Slack을 클릭해줍니다.

인커밍웹훅설정3
해당 페이지에서 설치할 채널을 넣어주는 것으로 Incoming Webhook의 설정은 끝이 나게 됩니다.

인커밍웹훅설정4
설정이 끝나게 되면 해당 페이지로 이동하게 되는데 여기서 Webhook URL을 메모해두었다가 Lambda에서 메세지를 Request를 보내는 처리를 구현하실 때 이 Webhook URL로 요청을 보내시면 됩니다.

Lambda 작성

람다작성
다음으로는 Lambda 함수를 작성해주어야 합니다.
이 람다에서 Cost Explorer에서 요금정보를 받아와서, Slack으로 메세지를 보내는 코드를 구현해주시면 됩니다.
(제가 사용한 코드는 11월 9일(화) 발표자료 블로그에 기재될 예정입니다.)

EventBridge(Cron) 작성

CRON작성
Lambda 함수의 작성이 끝났다면, 작성된 Lambda를 정기적으로 트리거 할 이벤트를 만들어야합니다.

AWS EventBridge에 들어가서 규칙생성에 들어가 줍니다.
규칙생성에 있는 Cron식의 값을 실행하고자 하는 시간대에 맞게 작성해주시면 됩니다.

주의할 점으로서 AWS에서 Cron식은 UTC가 기준이 되므로 한국시간에 맞추어 실행하고자 할 경우
실행하고자 하는 시간에 -9시간을 해주시면 되겠습니다.

예) 매일 아침 9시에 트리거 하고자 할 경우 → [0 0 * * ? *]

대상선택
Cron식을 작성한 다음 대상 선택에서 Lambda 함수, 그리고 함수명을 선택하는 것으로

연결
Lambda와 EventBridge의 연결은 끝이 나게 되며 매일 9시에 설정된 이벤트에 의해 작성한 Lambda가 실행되게 됩니다.

실행 결과

AWS요금알리미
위 과정으로 만들어진 서비스는 매일 또는 매달 특정 시간이 되면, 사용한 금액을 통지하게 됩니다!

일정 예산을 바탕으로 한 통지 방법 (No 코딩!)

다음으로는 코드작성 없이 AWS 콘솔만을 이용하여 설정한 예산을 바탕으로 통지하는
AWS Budgets를 사용한 방법입니다.

아키텍처

아키텍처2
예산을 바탕으로 한 통지의 아키텍처의 경우 프로그래밍 방식보다 간단합니다.

AWS Budgets를 이용해 AWS 서비스 이용에 할애할 수 있는 예산을 설정한 뒤
해당 예산 알림을 구독할 SNS를 작성합니다.

SNS에서는 구독된 값을 Chatbot으로 전달하고 Chatbot에서 Slack으로 통지하는 구조가 일반적입니다.

구현하기

가장 먼저 AWS Budgets를 구독하고 Chatbot으로 메세지를 전달할 SNS Topic을 작성해주어야 합니다.

SNS 작성

SNS주제작성
다음과 같이 주제 생성에서 표준을 선택하고 SNS의 이름을 입력한 뒤 작성해줍니다.

SNS주제작성2
작성하게 되면 주제가 생성되게 됩니다. 여기서 나오는 ARN값을 앞으로 사용하는 서비스들에게 연결하기 위해 메모해 둡시다.

SNS권한추가
다음으로는 Budgets의 값을 전달받을 수 있도록 권한을 추가해주어야 합니다.
편집으로 이동해서 액세스 정책 - 선택 사항의 값에 아래와 같은 값을 추가로 입력해줍니다.
여기서 Resource에 들어갈 값은 직전에 작성한 SNS Topic의 arn값을 입력해주시면 됩니다.

Chatbot 작성

SNS Topic의 설정이 끝났다면 Chatbot을 작성해주어야 합니다.

Chatbot작성
Slack 클라이언트를 선택하고 구성을 눌러주면 됩니다.

Chatbot작성2
Slack의 워크스페이스에 액세스할 권한도 허용해줍니다.

Chatbot작성3
마지막으로 Slack 채널 값에 채널 ID를 입력해주면 Chatbot의 작성은 끝이 납니다.
(채널의 ID값은 메세지를 받아볼 채널의 설정에 들어가시면 확인할 수 있습니다.)

Chatbot+SNS
Chatbot의 마지막 설정으로, 처음에 작성해둔 SNS Topic과 연결해 주면 Chatbot과 Slack이 연결되게 됩니다.

Budgets 작성

마지막으로 AWS 서비스 사용 비용 예산 값을 감시하고 임계 값 초과 시 SNS로 메세지를 보내기위해 AWS Budgets를 작성해주어야 합니다.

Budgets작성
여기서는 비용 예산을 선택해주시면 됩니다.

Budgets작성
Budgets에서는 일/월별의 예산 알림 기간과 예산 금액을 사용자 설정값으로 입력할 수 있습니다.

예산 금액의 경우엔 지불해야 할 비용이 설정한 금액에 가까워지거나, 같아졌을 경우 Slack에 알리고 싶은 금액대를 설정해주시면 됩니다.

Budgets작성
임계 값으로서는 메세지를 받아볼 기준을 설정해주시면 됩니다.
예를 들어 AWS에 할애할 수 있는 예산액이 5$로 책정한 경우에 임계 값을 75%로 설정했다면
AWS 이용요금이 5$의 75%인 3.75$가 초과하였을 때 알림을 보내게 됩니다.

이메일로도 받아보고 싶으신 경우에는 이메일 수신자란에 이메일을 입력해주시면 됩니다.

마지막으로 Amazon SNS ARN 선택의 값으로 처음에 작성해둔 SNS Topic의 arn값을 넣는 것으로
매달 5$의 75%인 3.75$ 이상의 비용이 청구될 경우 Slack으로 이를 알리는 메세지를 보내게 됩니다.

(주의할 점으로서, SNS Topic의 권한 설정을 잘못할 경우 SNS와의 연결에 실패하게 됩니다.)

실행 결과

마무리2

모든 서비스의 구성이 끝나게 되면
설정한 예산이 초과할 경우 아래와 같이 비용의 임계값과 실 청구액을 Slack 메세지로 받아볼 수 있게 됩니다!

정리

끝으로 두 구현 방법에 대한 정리입니다.

마무리1
첫 번째로 프로그래밍 방식의 경우 유연한 구현 및 커스터마이즈하기 쉬운 점이 장점입니다.
서비스별로 일별 사용코스트를 구해서 Slack으로 통지하는 등의 작업은
아직 콘솔 레벨에서 지원하고 있지 않기 때문에 Lambda를 활용하여 개발해야 합니다.

마무리2
두 번째로 AWS Budgets를 활용한 방법은 별도의 개발이 필요하지 않으며
콘솔레벨에서 간단하고 빠르게 구현할 수 있고, 특정 비용 초과 시 통지를 받아볼 수 있다는 점이 장점이 되겠습니다.