フォーム読み込み中
以前の「【Azure Function】Azure利用料金をSlackに通知する」の記事で、Azure Functionを用いたAzure利用料金をSlackに通知する方法をご紹介しました。本記事では、通知内容を分かりやすくするために加えた改善について取り扱います。
タグ付けのルールや警告のルールを設定し、Pythonで文字列の作成を行い、Slack Workflow Builderを活用して、コスト通知をわかりやすく改善を行いました。本記事は、その中での着眼点などについて取り扱います。
今回はAzureの利用料金を通知する仕組みを例に実装しましたが、基本的な思想はAmazon Web Services (以降、AWS)やGoogle Cloudでも活用できると思います。
以前の「【Azure Function】Azure利用料金をSlackに通知する」の記事では、ownerごとの利用料金を通知することができました。ownerの名前と、金額のみといった、シンプルな形になっておりますが、自分の利用料金が全体でどれくらいなのか、他の人や前回の利用料金との比較が難しかったです(左側の画像)。
それらの課題を解決したこちらが完成したのが、右側の画像です。用途ごとに利用料金を分類し、その中の割合の表示や、文字ベースのグラフの採用、変動量の表示などを適用することで、より分かりやすく表示を行いました。
Slack Workflow Builderを活用して、コストリストの通知や、リンクの案内、警告(要確認)などを実装しました。
本通知システムの特徴は、他のAPIやSlacck appを使用していないため、簡単に実装できることです。
以前の記事で作成された通知では、タグのルールは二つありました。しかし、ownerタグ以外は活用されていなかったため、より詳細のルールを作成しました。
まず、subjectのタグの形式を一律({環境名}_{利用目的})にするようにしました。その後、用途を区別するために、{環境名} のところに用途を表す3文字を入れることにしました。私は検証用環境のコストを取得していたので、次のような3つの区別でリソースを分けることにしました。
{環境名} | 説明 | {利用目的} | 例 | |
|---|---|---|---|---|
長期 | ops | 運用 | 用途・機能名 | ops_tool |
中期 | prj | プロジェクト | 各プロジェクトのチームで一意のタグ設定 | prj_name |
短期 (default) | dev, tmp | 開発、検証 | 基本自由(タグ省略可) | dev_test |
これによって、運用やプロジェクトの維持に使用されている利用料金を個人の利用金額から分離することができます。また、どのような用途に幾ら使われているかも把握ができるようになりました。
次は、分類された個人の利用料金をもとに、確認要請を出すルールを作成しました。特に、個人が使う場合を想定していたので、個人リソースの利用金額(1週間)を基準にしました。利用金額が高くなることは、検証が終わったリソースの消し忘れ(放置)によるものと予想されるため、以下のようなルールを作成しました。
番号 | 基準 | |||
|---|---|---|---|---|
1 | 金額 | 一定金額以上を警告する | 1万円 | 細かくなりすぎないため、下の条件と組み合わせる |
2 | 変動量が少ない | 変動量が一定割合以下の場合に警告する | 5% | 放置リソースを発見するため |
3 | 急増 | 変動量が一定割合以上かつ増加の場合に警告する | 30% | リソースの見直しをするため |
4 | 上位 | 上位者を強調する | 1~3位 | 自分のコストを意識させる |
これらのルール1〜4に該当する場合は、行末に追記するようにしました。また、複数のルールに該当する場合は、以下の組み合わせの場合に別枠で確認を要請するようにしました。
・ルール1 かつ ルール3 (金額が1万円以上かつ急増)
・ルール1 かつ ルール2 (金額が1万円以上かつ変動量が少ない)
Pythonで文字列を操作することで、以下のような表のような形で情報を表すことができます。
まず、習得した利用料金は、以下のようにリストに格納しました。
#利用料金のタグ別のリスト
〇〇_cost = [ [タグ名1, 金額1], [タグ名2, 金額2]...]
#タグ別の利用料金
##cost_list は一つのコストをもつリスト([タグ名1, 金額1])
for cost_list in 〇〇_cost:
...
Pythonの左寄せの関数を活用しました。タグの長さは一定ではないため、そのまま表示すると、見にくくなります。
上の関数を活用することで、以下のコードを使用することで、行末に半角スペースが挿入され、一行ごとの文字数を合わせることができます。
#文字数を35に合わせる
cost_list[0].ljust(35," ")
...
以下のコードを使用することで、コストの桁数を考慮した通知が可能です。
#コストの長さに関わらず、文字数を35に合わせる
cost_list[0].ljust(35 - len_cost, " ") + "¥" + "{:,}".format(cost list[1])
...
同様に、左寄せを活用して作ります。単純に文字のみで表示するより、情報が把握しやすくなり、直感的に比較しやすくなります。
空白の文字に、記号を入れることで作成することができます。今回は、四角を活用して、`▮▮▮▮▮▮▮▯▯▯`のようなグラフを作成しました。
*cost_grは、文字ベースグラフの中で、▮が何個しめるかの個数を決める変数として設定しています。
#▮と▯を活用してグラフを作成
"".ljust(cost_gr, "▮") + "".ljust(10 - cost_gr, "▯")
...
グラフが表す数字の例としては以下のようなものがあります。コスト削減に役立つと私が考えていたアイデアとしては
一定金額を表示する(1つの▮が1万円)
全体に対する割合を表す(1つの▮が全体の10%)
1位基準で比較する(1つの▮が1位の10%)
平均基準で比較する(5つの▮が平均)
変動量を表示する(1つの▮が利用料金の10%)
などがあります。
今回は、金額、変動量、平均金額などは別の取り組みで確認できるようになっていたので、「1位基準で比較する」を選択しました。
細かい工夫点としては以下のようなものがあります。
項目 | 予想される効果 |
|---|---|
タイトルの一行目の表示 | 各テキストの意味を明らかにする |
各タグごとの割合の表示 | タグごとの割合を知ることができます |
コスト変動の表示* | 前週比を明らかにすることや、警告のルールで使用します |
項目別の平均額の表示 | タグごとの料金を平均値と比較することができます |
項目別の総額の表示 | 用途別のコストの現状把握が容易になります |
*コスト変動は日付を指定してAPIに2回コストデータを要請し、差額を計算することで実現しています。ただし、コスト取得時は、時差(+9時間)とコストが反映するまでの時間(Azureは4時間)を考慮する必要があります。世界標準時刻を基準にすると、最低13時間以上のタームをおくことを推奨します。
Slack Workflow BuilderのWebhook機能を活用することで、簡単にSlackのチャンネルに投稿を行うことができます。
Slackメニューの開始から、ワークフロービルダーを開いてください。
その後、作成をクリックして、Webhookを選択することで下準備は終わりです。
ワークフロービルダーでは、変数名を自身で決定することができます。変数に色や一般的なjson形式のデータのようなテキスト以外のものを入れることはできません。ここで設定した変数名を利用して、Python側からjson形式のデータを送信します。より詳しい設定の方法は以前の記事を参考にしてください。
変数の設定が完了したら、投稿したいチャンネルにSlackの形式で書きます。
基本的にSlackのマークダウン形式で記述することができます。
これらを活用して、コードブロックを設定することや、絵文字を入れること、リンクを追加することなどが可能です。その中に、上で設定した変数を組み込みます。コードブロック中の文字列は等幅フォントで表示されるため、見た目を揃えることができます。
他にも、複数のメッセージに分けて投稿することや複数のチャンネルに投稿することもできます。
これらを活用することで、以下のような通知を送ることができます。
コストタグの機能を活用し、いくつかのルールを設けることで、コストを用途別に分類したり、確認が必要な人を別枠で表示することができました。
Pythonの関数を活用して文字列を作成することで、綺麗なテキストベースのメッセージを作成することができました。
Slack WorkFlow Builderを活用することで、Slackのマークダウン記法で記述することや、メッセージを分けて送信すること、複数の投稿先に送ることができました。
条件に該当するページがございません