僕はなぜMackerelにメトリクスを送ってしまうのか?
- Azure Portal より Mackerelの方が良く見ているのでそこにあると便利
- マネージドIDを試したかった
- ARMテンプレートを試したかった
理由をこじつけてプログラムして、こんな関数アプリ( GitHub - 7474/PostAzureCostToMackerelFunction )ができ、こうなった。
追記: 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テンプレート
取りあえずリソースは作れた。それ以上はこれからがんばる。
オチが付いた。