見出し画像

Azureコスト分析をSlackに通知する

やりたかったこと

Azureにはコスト分析の機能があります。
今月ってどれくらい使ってるんだっけ?というのを見ることができます。
こんな感じです。

AzurePortalから見るコスト分析

いろいろ試してたけれど、うっかり消し忘れたリソースが残ってて、お金が取られてしまうことがしばしばあるので、定期的な確認は必要です。

ただ、毎日見るかというと面倒なので、コストのアラートと予算オーバーしたときの通知は飛ばしているのですが、通知が来た時に見るのは、↑のコスト分析で、「あー、あの時作ったデータベース消し忘れてる。。。」とか思うわけです。

そこで、「コスト分析を毎日通知飛ばすようにしたらええんちゃう?」と思い、作ってみました。
作った結果、↓の通知が毎日Slackに飛んできます。

Slackに通知した内容

出してるものは、当月の合計・当月日ごとの合計・当月日ごとサービスごとの合計。当月日ごとサービスごとの合計は全日出すと長すぎるので、直近10日間のみ。
これを21時に飛ばすようにしているので、料金の増加があれば、その詳細を探すきっかけとできます。

さて、どうやって作ったのかを備忘のため書き残しておきます。

事前準備

コスト分析の取得の確認

ヘルプを展開すると、「API参照」がありますので、これをクリックするとAPI仕様が参照できます。

で、API仕様をみたところ、「ResourceGroupQueryGrouping-Legacy」を使えば、リソースごとのコストが出てくるようなので、これを使います。
※ Legacy ってあるのがすごく気になりますが。。。そのうち使えなくなるんですかね。

使ってみる、を押すと試せるのでやってみます。
SCOPEと本文を指定。

実行結果。
いい感じ。

プレビューのリクエストにある↑が投げられればいいということはわかったので、次はこのAPIに必要な権限の確認。サブスクリプションスコープのコスト管理の閲覧者があった。

Azure Functionsでは、コスト管理の閲覧者ロールがあれば、トークンを取得してコスト分析の取得APIを呼び出せる、ということになります。これで確認OK。

通知用のSlackチャンネル作成

公式ドキュメントに沿って実施。
通知用のURLを発行し、控えておきます。

コード(Azure Functions)

コードはGitHubのリポジトリ参照。
実装時に確認したことを2つ記載します。

Timer TriggerのCRONを環境変数から取得

Timer Trigger設定は、関数のカスタム属性で指定する必要があります。どうするんだっけ、ということで調べる。

スケジュール式をアプリの設定に含めて、% 記号で囲まれたアプリ設定名にこのプロパティを設定できます (例: %ScheduleAppSetting%)。

参照:Azure Functions のタイマー トリガー

ということなので、こうなります。

[FunctionName("Function1")]
public static async Task Run([TimerTrigger("%ScheduleSetting%")] TimerInfo myTimer, ILogger log)

ちなみに、ローカル実行時の環境変数は、local.settings.jsonに設定された値が取得されます。
参考:Azure Functions をローカルでコーディングしてテストする

アクセストークンの取得

インストールしたAzure.Identityの、DefaultAzureCredentialクラスを使用します。Azure上、ローカルで設定できる資格情報を順に試行してくれるので、コードは同じまま、ローカル・Azure上での資格情報の取得方法を切り替えることができます。Azure上ではマネージドIDから取得します。

var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions()
{
    ExcludeVisualStudioCredential = true,
    ManagedIdentityClientId = managedIdentityClientId
});
var accessToken = credential.GetToken(
        new TokenRequestContext(new[] { "https://management.azure.com" })
    );
var accessTokenString = accessToken.Token.ToString();
return accessTokenString;

コード(インフラ)

ローカルで動かせたことを確認の上、Azure上にデプロイします。
インフラはTerraformで構築します。
コードはGitHubのリポジトリ参照。

構成図

構成図はこんな感じです。
もうちょっとよい構成もあるような気もするのですが、今回はこれで。

構成図

まとめ

  • マネージドIDがわかっているようであいまいだったので、勉強になった

  • MS learnは一通り書かれてるから調べるのには便利

  • Azureをもっと好きになりたい

この記事が気に入ったらサポートをしてみませんか?