Microsoft Azure の利用費を Amazon QuickSight のダッシュボードで表示する

2023.01.23

いわさです。

普段 AWS を使うことが多くて、Azure はたまに利用する程度です。
ただし、利用頻度が低くても意図せぬ利用料金にならないように何かしらの対策は行う必要があります。

予算超過のアラートも悪くないのですが、個人的には正常であることを毎日確認したいと思っています。
ただし、Azure ポータルへのアクセス頻度が低いのでポータルにアクセスせずに日々の利用料金を確認出来るようにしたいなぁと思っていました。

今回試しに AWS 側にデータを取り込んで、QuickSight で Azure のコストを可視化してみましたので方法を紹介します。

アーキテクチャー構成

細かいところは省きますが、構成としては以下のような方式を採用しています。

  • Azure サブスクリプションのコスト分析機能で Azure Blob Storage へコストデータをデイリーでエクスポート
  • Amazon EventBridge で ECS タスクを日次で実行する。タスクは Rclone を使って Azure Blob Storage から Amazon S3 バケットへ Azure のデイリーコストをコピーする
  • QuickSight から Athena を経由して S3 バケットのデータを可視化する

Azure のコストをエクスポートし S3 へ取り込む

この流れは部分的に以下の記事で検証を少しづつ進めていました。

よって、Azure Blob Storage に出力されたコンテナ一式を ECS の Rclone タスクで Amazon S3 へ同期するだけです。
ここではデイリーエクスポートの CSV を丸っと AWS へ同期させます。

日次出力のファイルは対象期間の重複があるので最新の CSV 1 件のみを取り込むほうが無駄がないのですが「Logic Apps や Functions で処理するには私のスキルだとあと一週間はかかるな」と思ったのでそのまま取り込むことにしました。

Athena で読み込む

こちらの記事 と同じ方法で Athena を使って Amazon S3 へ同期された CSV ファイルを読み込みます。
日次出力 CSV は重複しているのでグルーピングして最大値を取ることにしました。
このあたりは重複削除するうまい仕組みがもう少しありそうですが次回以降の課題にしておきます。

SELECT
    UsageDateTime,
    SUM(MaxTaxCost)
FROM
    (
        SELECT
            SubscriptionGuid,
            ResourceGroup,
            ResourceLocation,
            UsageDateTime,
            MeterCategory,
            MeterSubcategory,
            MeterId,
            MeterName,
            MeterRegion,
            MAX(PreTaxCost) as MaxTaxCost
        FROM
            "azure-cost"."iwasazuredailycost"
        group by
            SubscriptionGuid,
            ResourceGroup,
            ResourceLocation,
            UsageDateTime,
            MeterCategory,
            MeterSubcategory,
            MeterId,
            MeterName,
            MeterRegion
        order by
            UsageDateTime
    )
GROUP BY
    UsageDateTime

いずれにせよ Athena のパワーでなんとかする方式です。
ファイルサイズが大きくなりパフォーマンスに影響が出そうなタイミングでパーティションや重複削除など検討したいと思いますが、今回のようにサービスとサービスを連携してソリューションを組み立てると、Athena だけ改善するなどがやりやすくて拡張性あって良いなという学びがありました。

Azure と AWS の集計結果を比較してみましょう。

なんだか微妙に誤差がありますが、だいたい近い値になっていますね。
まぁ許容出来る範囲なのではないかなと思っています。

数字が少しずれる問題も今後の課題にしたいと思います。

QuickSight で可視化

次に可視化の部分ですね。
先程の Athena で確認に使ってクエリのサブクエリ部分をカスタムクエリとしてデータセットを作成します。

UsageDateTime をカスタムフォーマットを指定して日付型に変更しておきました。
取り込みタイプは SPICE です。カスタムクエリである程度情報を削ってますし 1 日 1 回のデータ更新を想定しているので、ここは SPICE 一択かなと思います。

この時点でメジャーは日ごとの料金になっているので表示すると以下のようになります。

今回は Azure のダッシュボードで表示されるような累積のグラフを表示したかったので、以下のように累積用の計算フィールドを作成しました。

これをグラフで表示すると以下のようになります。

一方で Azure ポータル側でデフォルトの累積グラフを表示すると以下のようになります。
これはなかなか近い雰囲気が出てますね。悪くないのでは。

予算として 15,000 円/月 を想定してビジュアルフォーマットの参照線を追加してみました。
さっきまでのグラフだとここ最近で急激に使用量が増えており、ちょっとやばいか?という雰囲気が出てましたが、参照線を表示するとこのとおり。

まだまだ使えそうです。

自動化

出来るだけノーメンテで参照し続けたいので自動化は非常に大事です。
まず、Azure Blob Storage への出力は Azure サブスクリプションの標準機能でデイリータスクになっています。そこは特に設定は不要でしょう。

ここではそれ以降の部分を極力自動化してみます。

ECS タスクの定期実行

Rclone の同期ですが ECS タスクで定義してあるので Amazon EventBridge を使ってスケジューリングに従って必要な時だけ一時的に実行することが出来ます。

これで 1 日に 1 回 Azure から AWS へのストレージサービス間での自動同期がされます。
日本時間の AM 4:00 にスケジュール設定しました。

SPICE 定期更新

S3 へ同期された後に、QuickSight の SPICE へ取り込む必要があります。
これは QuickSight のデータセットに標準機能としてスケジュール更新機能が備わっていますのでそちらを使うことが出来ます。

日本時間の AM 5:00 にフル更新するようにしました。

表示期間の相対指定

QuickSight でダッシュボードを表示する時に取り込んだ全期間を表示して累積されても困ります。
請求期間あるいは月単位での累積データを確認したいところだと思います。

フィルター機能を使うことが出来ますが、毎度手動で操作するのも面倒です。
ここは相対日付機能を使って、当月の 1 日から末日までを自動設定させてみます。

QuickSight は UTC で動作するので、日本時間の AM 9:00 を超えるまで前月データが表示される可能性がありますが、まぁそこは許容します。JST 設定出来るようになってくれると嬉しいですが。

メールレポート

さらに、QuickSight へ毎日アクセスするのもちょっと面倒なので E メールレポート機能を使って、QuickSight へアクセスせずに当月ダッシュボードのデータをメールで確認出来るようにしてみましょう。

ダッシュボードのスケジュール設定画面でレポート配信スケジュールを設定します。
CSV の取り込みが 4:00 で SPICE の更新が 5:00 なので、レポート配信は 6:00 にしてみました。

さいごに

今回の構築内容で以下の Azure のコストレポートを毎朝受信出来るようになりました。

なお、ここまで設定して気がついたのですが、Azure サブスクリプションのコスト分析にはメールレポート送信機能が標準で備わってます。
今回のように最終的なアウトプットがメールレポートであれば Azure 側で設定ひとつで終わります。

将来 AWS マネジメントコンソールのウィジェットに QuickSight のビューを取り込めるようになったりしたら、結構夢があるなと思いました。