Azureコスト分析をSlackに通知する
やりたかったこと
Azureにはコスト分析の機能があります。
今月ってどれくらい使ってるんだっけ?というのを見ることができます。
こんな感じです。
いろいろ試してたけれど、うっかり消し忘れたリソースが残ってて、お金が取られてしまうことがしばしばあるので、定期的な確認は必要です。
ただ、毎日見るかというと面倒なので、コストのアラートと予算オーバーしたときの通知は飛ばしているのですが、通知が来た時に見るのは、↑のコスト分析で、「あー、あの時作ったデータベース消し忘れてる。。。」とか思うわけです。
そこで、「コスト分析を毎日通知飛ばすようにしたらええんちゃう?」と思い、作ってみました。
作った結果、↓の通知が毎日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設定は、関数のカスタム属性で指定する必要があります。どうするんだっけ、ということで調べる。
ということなので、こうなります。
[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をもっと好きになりたい