Slackで動いているAWS利用料通知botに項目を追加してみた。
2023-12-20
azblob://2023/12/04/eyecatch/2023-12-20-aws-cost-notification-bot-for-slack-000.jpg

こんにちは、淵江 椋太です。前回の記事から半年以上経ちましたが元気でやっています。

いきなりですが今年も残り僅かですね 、皆さんは今年はどんな年でしたか?私はゲームが豊作なのが嬉しかったですね、来年はドラゴンズドグマの新作がとても楽しみです。

あとは新生活が始まった事、特に食事は毎日同じようなものばかり食べているのでバランス良く栄養が取れていないと思います。

なので来年は食事のレパートリーを増やして色んな物を食べるようにしたいですね。

雑談が長くなりましたが本題に入ります。

概要

今回の話の前提としてAWS利用料通知bot自体は既に作成されていましたが「もっと細かい情報を表示してほしい」と、要望があったので項目を追加したいと思います。

AWS Lambda上で動作していますが今回はLambda関係の話は長くなるのでしません。

現状のbotの動きを簡単に説明すると、Slackのチャンネルに毎日3つの環境それぞれの今月1日から今日までに消費したAWSリソースの値段を投稿する

です。こんな感じ

現状のメッセージ内容

Slackのチャンネル内にそれぞれの環境名と、実績の部分に消費金額が表示されます。

今回はこれに項目を追加していきます。

コードはPowerShellで書かれています、 拡張子が「.ps1」のやつですね。

今回初めて触れたので詳しく説明できない部分もありますがご了承ください。

また、この記事の画像にある数値は実際の物とは違いダミーデータです。

要望の内容

  1. 月の予算に対して現在合計いくら使用しているのかとその比率
  2. 昨日と今日で消費金額の比率はいくつなのか
  3. グループをメンションしてほしい

などなど

項目の追加

早速作成していきます。

とはいえbot自体は既にあるのでいい感じに情報を持ってきていい感じに表示するものが殆どです。

  • 月の予算に対して現在合計いくら使用しているのかとその比率

これは

$cost_Sum = 0
foreach($row in $request.costs){
     $cost_Sum += $row.costAmount
 }

こんな感じでforeachの中で $cost_Sum にそれぞれの環境の合計金額を代入すればOKです。

詳しい説明は省きますが $row.costAmount には3つの環境それぞれの今月1日から今日までに消費した金額が代入されます。

これで合計金額は出せるので次は比率を計算します。

$ratio = [math]::Round(($cost_Sum / ”今月の予算をドルに変換したもの” * 100), 2)
これで今月の予算が現在何%使用されているかが$ratioに代入されます。
次は
  • 昨日と今日で消費金額の比率はいくつなのか
 
まず最初にAWSの利用料を取得します。
これは既に作成されていた関数を使います、詳しい説明は省きますが引数に開始時刻と終了時刻を入れるとその間にかかった費用が取得できます。
次にこれを使って二日前と三日前のかかった費用を取得し、何%増減したかを計算します。
$day_Ratio = [math]::Round(("二日前にかかった金額" / "三日前にかかった金額" * 100), 2)
で、なぜ昨日と二日前ではないのかと言うとAWSの料金集計時間が日本時間とズレがあり、正確な金額が取得できないので金額が確定する三日前と二日前にしています。
 
  • グループをメンションしてほしい
 
意外と?簡単です、slackに投稿する内容に
<!subteam^"グループID">

と記述します。こんな感じ

 # 内容
  $output = @"
  <!subteam^$groupID>
  〇期間: 【${start} ~ ${end}】
  〇Per Account
  環境/アカウントID/実績/前日比
  `n
"@

 今回は$outputを出力するのでその中に記述しています。

注意点としてグループIDはアプリのSlackからでは確認できず、Webブラウザ版のSlackから確認できます。

これで一通り出来ました。

米ドル/円を取得する関数の作成

これは要望になかったのですが、最初は予算を145で割ってそれを使って計算していましたがそれだと「実は予算が超えていた!」みたいな事が起こりそうなので関数を使って取得するようにしました。

function Get-ExchangeRate {
  $url = "https://api.exchangerate-api.com/v4/latest/USD"
  $response = Invoke-RestMethod -Method Get -Uri $url
  return $response.rates.JPY
}

この関数を使えば米ドル/円を取得できます。ただ、リアルタイムで取得できるわけではないので完全には正確な値ではないです。今回はそれで問題ないのでこれでいきます。

「あー今日は〇〇〇円なんだー」くらいの感覚です。

完成

これで完成です。あとは情報を増やしたりいい感じに情報を見やすくしたりしてこんな感じになりました。

項目追加後のメッセージ内容

どうです?いい感じではないでしょうか。

一目で今現在どれくらい予算を使っているのかがわかると思います。

レイアウトも見やすくなるように調整しました、特に下半分は綺麗に列を揃えれました。

まとめ

冒頭に書いた通り今回初めてPowerShell言語を使ってプログラミングだったので心配でしたが、事前に動くものが出来ていたのでそれを見ながら頑張ってみました。

ここでは触れていませんがAWSのアカウントIDや予算、アクセスキーといった機密情報はコード上に記述せずAWSのSecrets Managerで設定してそこから取得していたりと色々やっていますがそこまで話しているときりがないのでやめときます。

これ以上要素を追加しようとも思ってはいるのですが、思いつかないので料金botはいったんこれで完成ですね。