koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

AzureのコストをMackerelに送る、FunctionsとマネージドIDを使ってな

僕はなぜMackerelにメトリクスを送ってしまうのか?

理由をこじつけてプログラムして、こんな関数アプリ( GitHub - 7474/PostAzureCostToMackerelFunction )ができ、こうなった。

f:id:koudenpa:20200307235829p:plain

追記: https://twitter.com/koudenpa/status/1236313266432823297?s=20

自分は『xxxを勉強する』だと全然身が入らないので『xxxをつかってyyyしてみる』でxxxを知ることにしている。

今回は『ARMテンプレートとマネージドID』を『AzureのコストをMackerelに投稿してみる』ことで知った感じ。

ついでにAzureのコスト管理APIも少し知れてよかった。

Azure のコストを Mackerel に送る

AzureのコストはAzure Portalでとてもよく見える。なんとなく操作するとドリルダウンできるし、請求書のダウンロードだって可能だ。でも日常的にそれを見ているわけではないので日常的に見ているMackerelにあると便利だ。

AzureのコストはAPIで取れることは分かりきっていたのだけれど、色んなAPIがありすぎてどれをどう使えばいいのかサッパリ分かっていなかった。契約形態もいくつかあって難しい。ガチャガチャと色んなAPIを叩いてみて、今の請求期間のコストを毎日とるならこれかな? というのは Consumption Usage Details API である様子だった。

Azure Functions と Managed Identity

Azureリソースの権限管理はAzure Active Directoryで行われていている。

これはちょっと面倒なポイントで、例えばAWSでAzure Functionsと対応するLambdaにAWSリソースへのアクセス権を与えたいと考えたらLambda関数というリソースに直接AWSのIAM Roleを付与することができる。

これに対してAzure Functionsの関数アプリに権限を与えたいと考えたらまずAzure ADにアプリケーションを登録、そのADアプリケーションに必要なAzure SubscriptionのIAM Roleを付与した上で、関数アプリにADアプリケーションとしての認証をするコードを書かなくてはならなかった。当然クレデンシャルの管理も必要になる。

お手軽さが欠けている。

マネージドID機能を使うとADアプリの作成と関数アプリとの関連付けをやってくれる。アプリケーションにはアクセストークンの取得処理だけを書けばいい。これだけ。楽。トークンストアも考えなくていいのでほんと楽。

var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync(
    "https://management.azure.com/");

https://management.azure.com/ の部分はトークンを得たいサービスによって変わる

ARMテンプレート

取りあえずリソースは作れた。それ以上はこれからがんばる。

オチが付いた。