CostExplorer

【AWS】AWSの請求額をSlackへ通知する仕組みの構築

どうも、AWS勉強中のとがみんです。

仕事のための勉強ついでに、自分のAWSのアカウントを発行したのですが、従量課金のサービスが多いので、気づかぬ間に使いすぎて、多額の請求がこないか?と少し不安になったりします。。。

なので、コスト監視の仕組みを構築し、手間なくコストを確認できるようにしようかと思います。

そのためにLamdaを活用して、Slackに定期的に通知を送るように設定します。

今回やりたいこと

今回は、指定した日時になるとLamdaを起動し、LamdaがAWSのCostExplorerからその月にかかったコストを取得し、Slackに通知するという仕組みを構築していきます。

Serverless Frameworkを活用し、EventBridgeとLamdaを作成し、Lamda関数からCost Explorerにアクセスしその月にかかった費用の合計金額をSlackに通知します。

Cost Explorerへのアクセスは1回につき、0.01$かかるので、もし毎日通知するようであれば月約30円ほどかかるので注意が必要です。

今回作成したサンプルコードはGitHubにあげています。

作業手順概要

Slackへ通知するための設定をし、Lamda関数にて、CostExplorerへアクセスし、合計金額を取得して通知する仕組みを構築していきます。

  1. SlackでWebhook URL取得のための設定
  2. プロジェクトの作成とSlackへメッセージを通知するまで
  3. CostExplorerの設定
  4. CostExplorerへのアクセスと合計金額の通知するまで

作業手順詳細

SlackでWebhook URLの取得のための設定と、プロジェクトの作成からSlackへメッセージを通知するまでは下記の記事に記載しているので参考にしてください。

Cost Explorerの設定

AWS Cost Explorerとは、AWSのリソースの使用状況と、コストを可視化して分析できるサービスです。このCost ExplorerにLamda関数からアクセスし、AWSの利用金額を取得します。

Cost Explorerで時間単位、リソース単位で情報が取得できるので有効化しておくと良さそうです。

CostExplorerへのアクセスと合計金額の通知

Lamda関数にアップロードするソースコードを作成します。

serverless.yml

serverless.ymlの全体ソースコードは「aws-cost-alert/serverless.yml」に記載しています。

functions

呼び出す関数の指定と起動タイミングに関して記載しています。
起動タイミングは日曜日の午前8時に設定しています。

Amazon EventBridgeでCron式で設定するイベント時刻はタイムゾーンがUTC(協定世界時)になっているため、日本標準時(JST)との時差を考慮する必要があります。

cron(00 23 ? * SAT *)は土曜日の23時に起動するような設定になっていますが、日本時間だと+9時間の時差の考慮をする必要があります。

そのため上記の設定で日曜日の午前8時に起動するような設定になっています。

>Rate または Cron を使用したスケジュール式

BillingIamRole.ArnのIAMロールは次に記載するresourcesにロールを設定しています。

resources

ポリシーにはCloudWatchへのログの出力のための権限と、Cost Explorerからデータを取得するためのアクションを付与したポリシーをアタッチしています。

handler.py

handler.pyの全体ソースコードは「aws-cost-alert/handler.py」に記載しています。

メインメソッド

メインメソッドのpost_slackには、Cost Explorerのインスタンス化、合計金額の取得、Slackへの通知内容を作成して通知する処理が記載されています。

対象月にかかったAWSの合計金額の算出

対象月にかかったAWSの合計金額を算出する関数です。
コスト集計範囲を取得し、その期間にかかったコストを取得し返却する関数です。

対象月のコスト算出対象の初日と当日の日付を取得する

対象月のコスト算出対象の初日と当日の日付を取得する関数です。
「start_date」と「end_date」が同じ場合「start_date」は先月の月初の値を取得するようにしています。

デプロイと動作確認

serverless deployを実行して、AWSの環境に各種リソースを構築します。

指定した時間になったらEventBrideが起動して実行されます。

まとめ

AWSの対象月の費用を定期的にSlackへ通知する仕組みを構築しました。今回は合計金額ですが、サービス毎の金額の出力も追加していこうかと思います。

参考

AWSサービス毎の請求額を毎日Slackに通知してみた
【この記事だけで完結】Lambda+SNSでAWS利用料金をメール通知する【python】