[コストの透明性を高めよう] コスト管理のフレームワーク FinOps の Toolkit の紹介 ~使い方も添えて~

## Pre-knowledge
FinOps をご存じでしょうか？
FinOps とはクラウドを導入するに伴って以前のような CapEx のコストモデルから OpEx のコストモデルも考慮する必要が出てきました。
そのコストモデルに対して体系的にフレームワーク化した概念が FinOps になります。

:::note info
～FinOps の定義～
FinOps は、クラウドのコスト管理と最適化を目的とした運用フレームワークおよび文化的実践。FinOps は、技術、ビジネス、財務の各チームが協力してクラウドの使用量とコストを管理し、ビジネス価値を最大化することを目指す。
:::
以下が FinOps フレームワークの概要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/81ff8226-835a-1484-4f76-dd1afd94466c.png)


コンポーネントが沢山あり一見訳が分からないので簡単にまとめると、
**組織のみんなが強力しあってコストを常に意識&管理をし、ビジネス価値を最大化するためのもの**です。

その意識すべきことが Principle で、それを達成するための"やるべきこと"が Damain&Capability だったりします。

Forecasting の精度が上がれば予算の策定などの精度が上がって無駄なお金を使うことがなくなっていきますよね？つまりビジネス価値の最大化の一つの要因になります。

Capability は全部そんな感じです。
今回のスコープからは外れるので FinOps Foundation の公式ドキュメントを読んでみてください。

https://www.finops.org/framework/


## FinOps Toolkit Introduction
ではそれぞれの Domain&Capability のレベル上げにはやはり武器が必要です。そのレベル上げの武器として使えるのが FinOps Toolkit です。
コスト管理といってもマルチテナントの組織もありますし、マルチクラウドを利用する組織もあります。クラウドのビジネス価値を最大化するためにはすべてのコストデータをまとめて ROI を算出し、意思決定などをしていく必要があります。

Toolkit なので沢山ツールはありますが以下のようなものがあります。
🏦 FinOpsハブ – オープンで拡張性があり、スケーラブルなコストレポート。
📊 Power BI レポート – Power BI スターター キットを使用してレポート作成を高速化します。
📒 FinOpsワークブック – エンジニアが FinOps を通じてクラウドの ROI を最大化するためのカスタマイズ可能な Workbook。
📒 最適化ワークブック – コスト最適化の Workbook。
📒 ガバナンス ワークブック – ガバナンスの Workbook。

https://microsoft.github.io/finops-toolkit/

今回のブログではその中の FinOps Toolkit のコスト管理レポート (Power BI) を使用したコストデータのインポートの仕方や内部の仕組みに関して以下の項目に従って紹介します。

* 新しいコストのフォーマット FOCUS とは？
* 契約形態ごとの FOCUS データの取り扱い
* Power BI に FOCUS データをインポートしてみる

###  新しいコストのフォーマット FOCUS とは？
FinOps Open Cost and Usage Specification(FOCUS) は、請求データの共通形式を定義する画期的な取り組みで、複数のクラウド、SaaS、さらにはオンプレミスのサービス提供全体で支出とパフォーマンスを最適化できるコストデータのフォーマットになります。
つまりマルチテナントやマルチクラウドであっても、統一したコストのフォーマットを用いてコスト管理を一元化することができます。

できることは色々ありますが、
* コミットメントちゃんと使えてるか？の定量化
* コストマネジメントではできない このリソースの課金単位ってなに？(GB 単位とか時間単位とか)
* Network サービスだけでどれくらいコストつかってるの？(これもコストマネジメントでは細かく見れません)

などを分析するデータがまとまっているフォーマットです。

https://microsoft.github.io/finops-toolkit/focus#-benefits

FOCUS を使用することの利点は以下のドキュメントに記載がありますが、いくつか切り取って紹介します。

💰 ストレージとコンピューティングのコストを30%節約

FOCUSは、実際の(請求済み)コストと償却済み(有効な)コストを1行にまとめるため、実際のデータセットと償却されたデータセットを合わせた場合と比較して、行数が49%少なくなります。

:::note info
実際の（請求済み）コストは、クラウドサービスの利用に対して実際に請求された金額を指します。これは、使用したリソースやサービスに対して発生したコストであり、割引や前払いの適用がない状態の金額です。
一方、償却済み（有効な）コストは、すべての割引率、割引、および関連する前払い購入（一回限りまたは定期的なもの）を適用した後の料金の償却コストを指します。これは、実際のコストから割引や前払いの適用を考慮した後の金額であり、より正確なコスト管理や予算計画に役立ちます。
例えば、あるクラウドサービスの月額利用料が1000円で、年間契約による割引が20%適用される場合、実際の（請求済み）コストは1000円ですが、償却済み（有効な）コストは800円となります。
:::

🔀 複数のアカウントとクラウドを処理できる設計

複数のクラウドを使用している場合でも、1つのクラウドに複数のアカウントタイプ(EAやMCAなど)がある場合でも、FOCUSはコストデータを一貫した用語を持つ単一の設計がされています。

💹 コスト削減の定量化が容易

FOCUSには、単価に加えて、リストコスト、契約コスト、有効コスト、請求コストなど、各料金に使用される特定の価格モデルを識別するための列も含まれているため、交渉割引やコミットメント割引によるコスト削減を簡単に定量化できます。

🔡 サービス、リソース、SKUごとにコストを整理し、区別する

FOCUSは、サービス、リソース、SKUを明確に区別するため、コストの整理と差別化が容易になります。たとえば、帯域幅とコンピューティング コストはどちらも Virtual Machines サービスに分類されます。

### 契約形態ごとの FOCUS データの取り扱い
EA、MCA、MPA や従量課金などいろいろな形態で使用することができます。
しかし権限の問題などもあり、それぞれの契約形態やエクスポートするデータ量に伴ってコストデータを Power BI にインポートする方法が変わってきます。
その一部の比較表が以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/f8a056a4-6549-d0be-62fb-f903f183c1dd.png)

https://microsoft.github.io/finops-toolkit/power-bi#%EF%B8%8F-help-me-choose


また必要な権限は以下です。

| スコープ | 権限 |
|------------|------|
| `Subscriptions と resource groups (すべてのアカウントタイプ)` | Cost Management Contributor |
| `EA billing` | Enterprise Reader, Department Reader, or Account Owner (aka enrollment account) |
| `MCA billing` | Contributor on the billing account, billing profile, or invoice section |
| `MPA billing scopes` | Contributor on the billing account, billing profile, or customer |


Connector を使用することは開発が終わるため、非推奨となるので必然的に選択肢は Connector 以外になります。
* Cost Management で直接エクスポート
* FinOps hubs (storage)
* FinOps hubs (Data Explorer)
* Microsoft Fabric

FinOps hubs は Azure 環境内に Data Factory などのリソース群をデプロイしデータプロセスの自動化や、$65M を超えるコストデータを扱う際に使用することができます。
ちなみに異なるテナントのスコープでコスト管理のニーズがある場合は FinOps hubs を推奨します。
データのプロセスとしては Daily や Monthly で Cost Management からデータを抽出し、Storage Account にデータを格納しそれを Power BI が読み取る形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/3adacede-6b05-f971-1906-cd704ab11993.png)

https://microsoft.github.io/finops-toolkit/hubs/data

:::note info
FinOps hubs は Enterprise Agreement (EA), Microsoft Customer Agreement (MCA), or Microsoft Partner Agreement (MPA) アカウントである必要があります.  Microsoft Online Services Agreement (MOSA, aka PAYG) または Microsoft internal サブスクリプションの場合は FinOps hubs 0.1.1. を使う必要があります。 

v0.7 が 20024/12 時点での最新バージョンとなっています。(internal アカウントの自分は v0.1.1 の古いものしか使えず。。)

以下からダウンロード可能です。
https://github.com/microsoft/finops-toolkit/releases
:::

まずは試す！という方には Cost Management のエクスポート機能を使うことが推奨されており、$2-5 Million まで対応しています。
実際これが一番楽です。
今回はこの機能を使用して実際に Power BI にコストデータを反映させていきます。

### Power BI に FOCUS データをインポートしてみる
ではやっていきましょう。
必要になるリソースが
* Azure Storage Account (Data Lake Storage)
* Cost Management の FOCUS データ
* Power BI テンプレート (FinOps Toolkit v0.7)
の３つです。

**Step 1** として Storage Account を作成します。FinOps hubs では Premium の Block BLOB の Data Lake を使用しているため、それに則って作成しました。 

::: note warn
特にここでコンテナを作成することは必要ありません。
また BLOB Reader の権限を自身に付与します。(Power BI でデータをインポートするユーザーに対して)
:::

**Step 2** として FOCUS データをエクスポートしていきます。
現在 Azure でエクスポート可能な FOCUS のバージョンが 1.0r2, 1.0, 1.0-preview です。
FinOps Toolkit のドキュメントには 1.0, 1.0-preview のみ取り上げられていたかつ、v0.6 までは 1.0-preview のみ Azure ではエクスポート可能だったため念のため preview のフォーマットを使用します。
では Portal から Cost Management の Reporting + analysis の Exports を開きます。ここで FOCUS を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/85c3fb13-a677-659a-d335-0298e690e09c.png)

次にエクスポートの設定ですが、ここでフォーマットのバージョンを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/9935b832-f01b-97fc-6641-91cec6429183.png)

次の設定として出力先の Storage Account の設定やデータタイプを指定していきます。
フォーマットの推奨としては Parquet で コンプレッションタイプは Snappy とします。

::: note info
そのまま CSV や圧縮率の良い GZIP もサポートされていますが、以下の違いがあり、それなりの圧縮率で大量のデータ処理が必要になりうるコストデータは Snappy が推奨されます。

以下 Copilot による違いの説明です。
GZIP は、圧縮率が高く、ファイルサイズを大幅に削減することができますが、その分圧縮と解凍に時間がかかることがあります。GZIP は、特に大きなファイルやアーカイブの圧縮に適しています。

Snappy は、圧縮率よりも速度を重視して設計されており、圧縮と解凍の処理が非常に速いのが特徴です。そのため、リアルタイムのデータ処理やストリーミングなど、速度が重要なシナリオでよく使用されます。
:::

これで Run をし、エクスポートすることによってデータ量にもよりますが 15~30 分で出力が完了します。

**Step 3** として Power BI にデータを取り込みます。
今回は FinOps Toolkit v0.7 の Power BI テンプレートを使用します。以下からダウンロード可能です。

https://github.com/microsoft/finops-toolkit/releases/download/v0.7/PowerBI-storage.zip

ダウンロードが完了したら、テンプレートを開き、Data Lake の URL を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/536d924e-0e4a-ccc0-bc55-7b3a680e1eee.png)

Load すると Storage Account(Data Lake) と GitHub に対して認証が走ります。
GitHub はオープンソースとして FOCUS フォーマットを整えるための PriceUnit の変換のために使われるっぽいです。

::: note info
たまに何も反映されないときがあり、色々調べましたがよくわかりません。その場合無責任なことを言いますが、やり直してください。。。
:::

では早速中身を確認していきます。内容としては以下の項目が見えます。
様々なスコープからコストデータを確認することができて、Cost Management でいちいちフィルタリングする必要があったデータがレポートとしてそのまま反映されているので、コスト分析がはかどる印象です。
* Summary
* Services
* Subscriptions
* Resource groups
* Resources
* Regions
* Inventory
* Prices
* Purchases
* Charge breakdown
* Raw data
* DQ

Summary では Cost Management に似ている面もありますが、Total Savings が定量的に確認できる点に違いがあります。一般的な KPI を表示してくれる感じですね。
これには**コミットメントや割引などを含めて List Price との差を表示**します。

::: note info
List Price とは、クラウドサービスの料金を割引や前払いの適用なしに、標準価格（小売価格または従量課金価格）で表したものを指します。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/4d73e755-66ca-c319-a854-7d8d828c6db6.png)

次に Services です。
Cost Management では見えない ServiceCategory というデータによって、**使用しているリソースが Networking などの大きな区分で表示されます**。確かに Bastion とかは ジャンプボックスとして private で RDP/SSH をするものなので Networking だなと。
この様にして比重のかかっているコンポーネントを大きな粒度で洗い出すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/6d55ace9-fa8e-e639-c26f-9c6f3f7de117.png)

次に Prices を確認してみます。
ここでは EffectiveCost (償却済みコスト)や List などを確認することができ、EffectiveCost ではより正確なコスト管理や予算計画に役立てることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/ff5ff53c-ad54-7636-6020-1391b4f6bd18.png)

次に Row Data を見ていきます。
ここではとれるインサイトが多いので一つに絞ります。
各リソースで課金される単位が異なることはご存じだと思いますが、
料金計算ツールやドキュメントを参照して理解する手間が省けます。
FOCUS のフォーマットには ConsumedUnit があり
そこから **GB 単位なのか Hours 単位なのかなどの細かい違いが分かります**。
これは配賦モデル考える時に便利ですねぇ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/2580bb9b-729e-c7d6-be27-2aa0707efb7f.png)

次にサブスクリプションを見ていきます。
このページは、チャージバック レポートを作成し、サブスクリプションの使用方法に応じて、
**最もコストが多い部門/チーム/環境を決定する場合に役立ちます**。
なので複数のサブスクリプションが表示されるデモ用の Power BI で確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/f8d84c3c-a401-7e46-bb9a-d83f5988d16e.png)

複数のサブスクリプションにまたがって課金データの確認ができました。

さらに細かなレベルでリソースグループも見ていきます。
このページは、チャージバック レポートを作成し、リソース グループの使用方法に応じて、
**最もコストが最も多いチーム/プロジェクトを決定する場合に役立ちます**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/ac28bca4-8f1d-8a0b-9343-a49fdd6bfa99.png)

次に Inventry つまり棚卸資産の確認をしていきます。
リソースの種類の一覧が表示され、
**各種類のリソースの数、合計コスト、およびリソースあたりのコスト**が表示されます。(見やすい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/1978422a-7a68-765f-a690-cb11dbf71813.png)


最後に Charge breakdown を紹介します。
**視覚的に List と EffectiveCost の利用やコストのかかっている ServiceCategory からリソース**まで深いインサイトを得ることができます。
個人的に最初にここ見て大きくコストの傾向を理解するのもいいかと思いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/3813fd02-06e7-d2de-d656-ad130193d86f.png)

以上が Power BI の CostSummary の紹介でした。
おまけで Governance の Power BI も少し紹介します。
ここでは Advisor と Azure Resource Graph と連携しており、Advisor 以上の推奨事項を確認することができます。
こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/0f6955d4-ca58-5ed7-981b-ebb2c5501091.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/68c55f70-76cd-4ef6-03e9-54d509b03d4e.png)

個人的にいいなぁと思ったのが NSG のレポートです。
NSG のルールと以下(一部抜粋)の項目に従って脆弱なルールなどを検出できます。

* ポートの最小化: アプリケーションに絶対に必要なポートのみを開放します。これにより、攻撃対象領域と潜在的な脆弱性が減少します。
* 特定の IP 範囲の使用: 広範なアクセスを許可するのではなく、特定の IP アドレスまたは範囲にアクセスを制限します（例: 0.0.0.0/0 の使用を避ける）。これにより、信頼できるソースのみに露出が制限されます。
* 最小特権の原則の適用: タスクに必要な最小限の権限が付与されていることを確認します。これは、ポートとそれにアクセスするユーザーの両方に適用されます。
* ルールの定期的なレビューと更新: NSG ルールを定期的にレビューして、それらが依然として関連性があり必要であることを確認します。不要になったルールは削除します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/fbefc912-7828-211e-f1ac-6a9966e572e4.png)


## Wrap Up
本ブログでは FinOps Toolkit の特に CostSummary レポートを紹介しました。Cost Management で得ることが難しいインサイトや、マルチテナント・マルチクラウドユーザー向けに FOCUS フォーマットを取り入れることができることを説明しました。
Power BI の権限だけあれば、FinOps の Princple である 
* Teams need to collaborate
* FinOps data should be accessible and timely

など促進することができ、よりコストの透明性が上がると思います。
また**クラウドコストの詳細をアーキテクトやエンジニアリングのチームで閉ざすことなく、予算策定のために Azure 権限をもたないチーム (例えば Finance チーム）に公開することができ、タイムリーな意思決定や予算の策定の正誤が上がることが期待できる**と感じます。

何かご質問あればお願いします！
ではでは。