Microsoft Fabric のコスト試算について解説してみる

## はじめに

Fabric のコスト試算について解説してみます。

2024/12/25 時点の情報です。

## コスト要素

Fabric のコスト要素は主に二つです。

- コンピューティングコスト
    - Azure VM などと同じ、SKUに基づく単価と起動している時間をベースにしたコストです。
    - 容量で供給されたCUによって計算することができます
- ストレージコスト
    - OneLake 上に保存されたデータ量に基づくコストです。
    - データ量から計算することができます。

ストレージコストは完全な従量課金と言えますが、Fabric 容量の使用（CU）は実際の利用に関わらず容量が起動している時間(供給されたCU量)に基づいて課金が発生する点に注意ください

## 試算ツール

[料金計算ツール](https://azure.microsoft.com/ja-jp/pricing/calculator/) の見方を解説します。

Microsft Fabric を選択して、試算のパラメータを確認していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9d621c72-8926-3352-8b01-c687135abc06.png)

### コンピューティングコスト

現代の分析環境でコストの大部分はコンピューティングです。
試算ツールからは コンピューティングコストはSKUと利用時間、Reservation （予約購入）が基礎数値であることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/098435fb-619c-5ff8-8273-fa2a6c224e90.png)

[Microsoft Fabric 価格の詳細](https://azure.microsoft.com/ja-jp/pricing/details/microsoft-fabric/)からわかるように各 SKU ごとに時間単価が決まっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6ca974de-69a8-3371-beaf-4c506408576e.png)

SKUが高いほど、秒間に供給される CU が多いということになります。

:::note info

CU は Fabric の処理を動かすための通貨のようなものです。
各機能ごとに消費CUの重みづけがありますが、大きな処理では多くのCUを消費して処理を早く終わらせるバースティングという機構があります。

当然供給される CU 以上の消費が発生するタイミングがありますが、10分または24時間（使われた機能によって分岐）にわたって消費した CU がならされるスムージングという機構があるため、供給 CU 以下の利用となるように設計されています。

参考リンク
- [Fabric & Premium 容量のスムージングとスロットリング](https://qiita.com/ayumito/items/d27fedc0632274015427)
- [Fabric 開発ガイド 1.0](https://speakerdeck.com/ryomaru0825/microsoft-fabric-kai-fa-gaido?slide=150)

:::

起動時間に単価が係る計算なので、基本的には、SKUを設定し、月中で 730 時間利用した場合で試算することが多いかと思います。

ただし、停止・再開の運用を見込む場合には注意が必要です。

>容量を一時停止すると、その容量での残存累積超過分と平滑化された操作は合計され、Azure の請求書に追加されます。
引用: https://learn.microsoft.com/ja-jp/fabric/enterprise/pause-resume

とあるように、CUのスムージング(要は前借り)が残っている状態で容量を停止すると、それを清算する仕様となっています。

たとえば F2 SKUで、730時間の利用を予定していても、**1時間分のCU超過がある状態で停止後すぐ再開** のようなオペレーションをしてしまうと、1時間の超過 CUとして 7200 CU (秒間供給CU * 60 * 60)が請求に追加されてしまい、月間としては　**731 時間ぶん Fabric を利用した** という計上になります。

計算ツールで費用に直すと、1時間あたりの F2( 2 CU/秒) 利用料は 64.45 円（12/25時点）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f76f4d2a-e0ac-6af6-f5ae-c47b5cdbbb4c.png)

このように停止再開で費用が抑えられるケースももちろんあるとは思いますが、スムージングの機構により常に CU は前借りされるような仕組みとなっているため、停止期間によっては、そのまま立ち上げていれば 前借りが順当に返済されたのに、停止による即時返済＋返済をしない起動時間の発生により余分に費用がかかってしまった、ということがないように運用を検討する必要が出てきます。

また、年間予約の割引率が4割と非常に高いので、停止する場合には月の半分以上停止している時間を作らないと結局割高になる、という点にも注意が必要です。

#### 予約容量について

1年間の予約が可能です。

支払方法などは書くアカウントセールスの方にご確認が必要ですので、基本的な考え方を記載します。

Fabric 容量の予約は、言い換えると、購入したSKUに基づいて、**時間ごとの CU供給枠 を割安単価で事前購入する仕組み** です。つまり、利用のなかった時間は無駄になり、かつ持ち越されません。

また、停止による急激なCU清算や、SKU変更があった場合には対象時間の予約分で賄えない分について従量課金での単価となります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8a4074ca-62da-42cb-a8e0-8d6772d7174f.png)

### ストレージコスト

ストレージコストは スタンダードストレージ or BCDR ストレージでの費用と、OneLake Cache の費用がそれぞれ発生します。

#### スタンダードストレージ

既定では Azure Data Lake Storage Gen 2 の ZRS 相当となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6fc961f7-6c63-0bd1-6077-d55eae19cfac.png)


#### BCDR 

BCDR 機能を有効にした場合にはペアリージョンにレプリケーションされるので、　GZRS 相当になっています。この機能を有効にした場合には、スタンダードストレージとしての請求は発生しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/79785c04-866d-786b-f473-e66ad129f48b.png)

#### OneLake Cache

Cache は、 [KQL データベースの キャッシュ層](https://qiita.com/ryoma-nagata/items/3106ff09079b71bf3af3#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%8F%E3%82%A6%E3%82%B9%E3%81%AE-onelake-%E3%81%B8%E3%81%AE%E5%8F%8D%E6%98%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)か  を Data Activator が保持する領域で使用されます。

費用はPremium Storage の ZRS 相当になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5ae2f727-f947-ec65-1c32-99967eeb253e.png)

#### ストレージ量の確認方法

実際のストレージ量は [メトリック アプリのストレージ ページ](https://learn.microsoft.com/ja-jp/fabric/enterprise/metrics-app-storage-page) の **Billable** から目安を確認可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f7c87a21-592b-5a70-48ed-3c35a5861d1a.png)