Infracost を用いたクラウドのコスト管理 (Azure)

## Introduction
クラウドコストの管理に頭を悩ませている人も多いと思います。
Infracost は、デプロイ前に Terraform のコスト見積もりを提供することで、クラウドコストのシフトレフトアプローチを可能にします。これにより、エンジニアリングのワークフロー内でコストに関する議論を効率化し、デプロイ後のコスト戦略の乖離を防ぐことができます。

https://www.infracost.io/

さらに、Infracostはクラウドベンダーの Well-Architected Frameworks(W-AF) に準拠した FinOps のベストプラクティスをサポートし、必要なタグキーや値をチェックすることができます。これにより、チームのコスト削減を実現し、効率的なクラウド運用が可能になります。

InfracostはAWS、Azure、Googleに対応しており、幅広いクラウド環境で利用可能です。クラウドコストの管理をよりスマートに、そして効率的に行えるサービスになります。

:::note info
 2024 年 8 月の現在では対応している IaC テンプレートは Terraform のみです。(早く Bicep でほしい)
:::
本ブログでは Infracost の基本ということで、Azure に Terraform でテンプレートを展開するときのコスト管理を
* VS Code 上のコスト管理
* CI/CD によるコスト管理
* Infracost 上でのコスト管理

の 3 点に分けてご紹介します。

## 前提
今回の検証環境では VScode を使用し、以下の Azure インフラの構成のテンプレートを用います。

<div style="text-align: center;">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/4839007d-e070-3b64-aaf6-5e5164fb8b0b.png" alt="画像タイトル">
</div>

また GitHub を用いて CI/CD のパイプラインを組みます。
実現できることは以下です。
* pull request をあげる
* Infracost の組み込みのイメージが(Docker イメージ)自動でマージ対象の branch とのコストの比較をし、増加分や W-AF, FinOps のフレームワークの推奨事項に沿って推奨を提示

CI/CD を組み合わせてコスト管理をする場合、以下のサービスが使用可能ですが、推奨の GitHub を使用する場合は非常に簡単に組み込むことができます。

:::note info
CI/CD でコスト管理をする場合は
* GitHub
* GitLab
* GitHub Actions
* GitLab CI
* Atlantis
* Azure Pipelines
* Jekins
* Bitbucket Pipeline

を使用可能ですが、推奨の GitHub、GitLab を使用する場合は非常に簡単に組み込むことができます。
:::

## VS Code 上のコスト管理
まず 2 点準備が必要です。
1. Infracost を CLI 上で使用するために [Infracost をインストール](https://www.infracost.io/docs/#1-install-infracost)
2. VS Code の Infracost の[拡張機能](https://marketplace.visualstudio.com/items?itemName=Infracost.infracost)を有効化します。

Terraform プロジェクトのディレクトリで
``` bash
# Terraform variables can be set using --terraform-var-file or --terraform-var
infracost breakdown --path .
```
を実行することで、現在のテンプレートを実行した場合の Montly のコストを確認することができます。
あまりにも簡単。。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/daca65e5-2808-202f-78b6-0d6c031fdb92.png)

この場合 NAT Gateway などのコストを推定できるほか、Total として $120.68 のコストが試算されていることが確認できます。
また個々の課金対象となるリソースに関しては

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/8eae75ae-b578-5ff2-4551-23c3d65a509a.png)
赤枠の中のようにコストを算出してくれます (便利ですね)。 またその詳細を別タブでクリックすることで画面分割左側のように確認できます。

## CI/CD によるコスト管理
実際のプロジェクトにおいて、現状のコストと機能を追加・削除した各上位フェーズのコストの差やプラットフォームエンジニアが W-AF, FinOps のフレームワークに準じて構築したかの差分は気になると思います。
例えば、main branch がプロダクション、他の branch (branch A とします) がテスト環境という単純な例を考えると以下のような CI/CD の流れがコストの観点で展開ができるようになります。
1. プラットフォームエンジニアが branch A を checkout しpush します
2. pull request をします 
3. 今までは機能の差分やテスト目的以外に、コスト観点でリーダーが pull request を承認するかしないかを確認します 
4. main branch に merge します

3 において、承認者は pull request のコメントにて Infracost が自動でコスト観点のコメントを以下のように追加したコストの増分や推奨事項を確認することができます。
Infracost をソースに埋め込む手順ですが ドキュメントによると 15 分程度で終わります。(実際にそうでした)

https://www.infracost.io/docs/integrations/cicd/
今回ではわざと VM のサイズを DSv2 とし、Dv5 が推奨されることを狙って試してみた結果、しっかりのその推奨が自動で返されていることを確認することができました。
そして以下のように Terraform テンプレートに仮想マシンを一台付け足しました。
``` bash
resource "azurerm_linux_virtual_machine" "my_terraform_vm" {
  name                  = "vm-2"
  location              = azurerm_resource_group.rg.location
  resource_group_name   = azurerm_resource_group.rg.name
  network_interface_ids = [azurerm_network_interface.my_terraform_nic.id]
  size                  = "Standard_DS1_v2"
```
つまり main branch に対して仮想マシンを一台追加したため、その分の増分のコストの $81 も確認できました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/5e0121f0-ba26-0f6d-6bc8-8bc3ef1a5dd7.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/2632d5b4-f6fa-e910-820e-fb08b5468523.png)

またさらなる詳細は Infracost の Web アプリケーションで確認することが可能です。
実際に以下の図のように branch、pull request ごとに FinOps の Policy で issue が上がっていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/de8e0b52-1dd4-8c42-2aff-ce0bfdb9414e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/87227a17-5b47-a046-39b7-96f56a13e46f.png)


## Infracost 上でのコスト管理
今回は検証レベルですので、確認できる要素は少なめでしたが、公式ドキュメントからの引用ですが、コンピュート、Log、タグなどの観点でチームの状況をダッシュボードで確認することができます。この際にレポジトリーを紐づける必要があるので、紐づけたレポジトリーのコスト内容をここでは提示してもらえる形になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693422/15787fe9-ec5a-ab4e-77c3-508824a0136d.png)

また レポジトリーを Infracostに接続すると、コードをスキャンし、50 以上の AWS、Azure、Google の FinOps ポリシーをチェックします。 Visibility > Repos ページにアクセスすると、レポがどの FinOps ポリシーで失敗しているかを確認できます。
その他にも、タグのポリシーや、ガードレールを自身で設定することも可能です。
チームがどれほどタグポリシーに沿って テンプレートを展開しているかなどもグラフで可視化されるため、財務責任を持たせるという特に重要なコスト管理の文脈にも最適化と思います。

https://www.infracost.io/docs/infracost_cloud/tagging_policies/

## Wrap up
クラウドコストの管理は、現代のエンジニアリングにおいて避けて通れない課題です。各ベンダーの Well-Architected Framework (W-AF) とFinOps のベストプラクティスに従うことで、コスト効率の高いクラウド運用が実現できます。Infracost は、これらのフレームワークに準拠し、デプロイ前にTerraformのコスト見積もりを提供することで、クラウドコストの管理を可能にできます。

今回確認できたこととして Infracost を活用することで、エンジニアリングチームはデプロイ前にコストを把握し、適切なタグ付けやリソースの最適化を行うことができます。これにより、デプロイ後のコストの驚きを防ぎ、持続可能なクラウド運用が可能になると感じました。

ではでは