Azure環境のコスト適正化に向けて出来ること

# はじめに
Azure環境を数年間運用していると、検証目的で作ったリソースやバックアップしたBLOBが残っていて余計な課金を発生させてしまっていたり、気が付いたら高額になっているサービスがあったりと、何かとコスト周りの悩みが出てきます。個人環境だと（自腹であるが故w）課金対してシビアですので即対策しますが、会社などで、特に共同利用している環境だと管理者が各々のリソースの利用状況を把握し辛いため、こういった対策が遅れがちです。しかし、余計なリソースはきちんと削除してコストの適正化を図りたいですよね。今回はAzure環境のコスト適正化に向けて今できることをまとめてみました。

## 削除できそうなリソースグループを特定する
Azureではリソースグループという概念がありますね。目的に合わせてリソースグループを作成していることが多いので、まずはリソースグループ単位で削除できそうなものを特定していきましょう。

### リソースグループ名で特定する
リソースグループ名に「__test__」や「__PoC__」といったワードが入っているものは疑ってかかりましょう。[リソースグループ]からフィルタで特定ワードを入れると条件に合ったリソースグループが出てきます。あとはアクティビティログから作成者を特定して「本当に必要なリソースか、削除できないのか」を問い詰めていきましょう。アクティビティログはデフォルトで90日という保管期限がありますので古いリソースについては作成者の特定が難しいかもしれません。Azure Policyを使って特定のタグ（作成者や作成日）の入力を強制する運用もアリですね。


↓こういうのは削除候補
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/2baf8894-fb94-843b-8608-2eb25054c4ad.png)

あとは、連番がついているもの「xxx_RG」「xxx_RG2」「xxx_RG3」や、日付がついているもの「xxx_RG_20230130」なんかも怪しいです。暫定的に作成された可能性があります。このように、リソースグループ単位で環境削除ができれば大きなコスト削減に繋がるので効果的です。

### コストが高いリソースグループを特定する
Cost Managementというサービスでリソースグループ単位の課金情報を見てみましょう。このサービスはフィルタのかけ方が重要です。先月のリソースグループ単位の課金情報を見たい場合は、[Cost Management]→[コスト分析]進み、下記の赤枠のフィルタ設定をしてみましょう。（細分性を”累積”にすると日単位の増加量が見えるようになりますが、後述する[ダウンロード]の内容が日単位になってしまいます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/6fc8580d-8456-944f-8a30-3ffad1d20535.png)

ちなみに青枠の[ダウンロード]を押すと、表示されているデータを様々な形式でダウンロードすることができます。コストレポート作成時の元データとして利用すると便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/c83991f2-2563-5c2d-262d-991d12ad098a.png)

ここからコストが高くなっているリソースグループを特定し、作成者に「あなたの環境コスト上がってますが適切に使っていますか？」と問い詰めていきましょうw 案外こういう環境に不要リソースが眠っていますので大きくコスト削減できるかもしれません。

## 削除できそうなリソースを特定する
リソースグループ単位で削除できましたら、今度はリソース単位で見ていきましょう。

### コストが高いリソースを特定する
先ほどのCost Managementを使っていきましょう。同じく[コスト分析]を開き、下記の赤枠のフィルタ設定をしてみます。今度はリソース毎にコストが高いものが一覧化されます。リソースの場合は”その他”の割合（グラフの灰色部分）が大きくなってしまいますが、対象領域をクリックすればドリルダウンしていくことができますので2~3階層まで掘っていってもいいかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/9d58c819-3c3f-23b6-d640-1b5c45a52887.png)

上記の環境ではAuzreML系のサービスが結構使われていますが、他の環境も含めて見てみると下記のサービスが課金の上位に来る印象です。（利用用途によって全く変わりますのであくまで個人の感覚です。）このあたりのサービスについてコストを下げる方法を調べてみました。

__1. Application Gatweay(v2)__
__2. Azure Firewall__
__3. Azure Bastion__
__4. Azure Monitor(LogAnalytics)__
__5. Azure Storage__

### 常時起動しなくてよいサービスは停止しておく
削除はできないけど、常時起動しておく必要はないというシーンが良くあります。「使っていない時は停止しておく」というのが鉄則です。、仮想マシンについては比較的意識されていますがPaaSサービスについては忘れがちです。「Application Gateway」や「Azure Firewall」のようにスクリプトから停止できるものもありますので、必要に応じて停止を検討しましょう。詳細は下記の記事で解説しています。

https://qiita.com/hiro10149084/items/466269dea2d29f04d93f

### サービスの共同利用を検討する
「Azure Firewall」と「Azure Bastion」はお高めのサービスですので、同一環境内に乱立されたくないものです。プロジェクトの検証などで短期間の利用であれば使い終わったら削除してくれればよいですが、常時使うものについては、環境内の共通リソースとして用意して利用者に展開してもよいと思います。

### Log Analytics のコストの下げ方
PaaS利用環境で何でもかんでも「Log Analytics」に格納すると意外と高額になります。Log AanalyticsのWorkSpaceの金額については、[コスト分析]のフィルタ設定で「Service name:Log Analytics」「Resource type:microsoft.operationalinsights/workspaces」を選択すると確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/680f9918-2ebe-7493-acb7-e1e703f5ea7a.png)

Log Analyticsの課金体系は以下の通りです。Log Analyticsの[使用量と推定コスト]に進むとおおよその金額感を確認することができます。
* ログデータのインジェスト（取り込んだログ量）
* ログデータの保持（31日以降保管しているデータ量）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/80013e4c-f1f9-8c6c-eba3-8bdcbf072987.png)

#### ログデータの保持期間を短くする
Log Analyticsは31日間のログデータ保持は無料ですが、31日以降の保持には課金が発生します。先ほどの画面上の[データ保有期間]を押すと設定することができます（最大730日まで）。ログデータ保持期間が大きい場合は改めて設定値を見直しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/0ca42a30-9573-db2a-469d-b8778448422b.png)

データによって保持期間を変更することも可能です。デフォルトは30日にしておき、必要なデータのみ90日にする、といった設定になります。変更手順は、まず[テーブル]から期間を変更したいテーブル名の[テーブルの管理]を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/1dd6cabf-e22d-fe9d-28ad-cf7a027a805d.png)

するとこんな感じで保持期間の変更ができるようになります。これで多少コスト削減効果が得られると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/2f712c14-17dd-7af0-a611-f24adcc49cb3.png)

#### インジェストするログを減らす
先ほどの"利用状況のグラフ"の下部にあるカテゴリを見てみると、どのカテゴリのログが多いかを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/f69b090e-e1c0-bdd7-6fe8-88f2f0b22aaf.png)
ここからはなかなか判断が難しいのですが、出力量が多いカテゴリに紐づくログについてLog Analyticsへの連携を止めてしまうという方法が取れます。Log Alalyticsへ連携する目的はクエリ検索によりログの中から簡単に目的の情報が得られることです。他方、クエリ検索する必要がないログはLog Analyticsに連携する必要はありません。各サービスの診断設定から、不必要にLog Analyticsにログを送っている場合は止めてしまいましょう。

### Azure Storage のコストの下げ方
古いIaaS環境だと、仮想マシンに非管理ディスクを使っていますので、ストレージアカウントの"vhds"コンテナ配下に大量のvhdデータが存在している可能性があります。また、そうでなくともデータサイズが大きいBLOBを残したままにしているケースがあると思います。こういった中から不要なデータは削除してしまいたいですね。

#### PowerShellスクリプトで一括取得
とはいえ、ストレージアカウントの中を一つ一つ開いていくのは現実的ではありません。ここでは簡単なPowerShellを書いて一括取得してみます。以下のスクリプトは、環境内の全てのストレージアカウントから5GB以上のBLOBを出力するサンプルです。こんな感じで条件に合ったBLOBを抜き出してみましょう。ただし、ストレージアカウントにファイアウォール設定が入っていて、スクリプト実行環境がファイアウォール外にある場合、情報取得時に弾かれてしまいますので注意してください。（事前のIPを登録する等対処が必要です。）
```powershell
$saall = Get-AzStorageAccount
foreach($sa in $saall){
    $saKey = Get-AzStorageAccountKey -ResourceGroupName $sa.ResourceGroupName -Name $sa.StorageAccountName
    $saCtx = New-AzStorageContext -StorageAccountName $sa.StorageAccountName -StorageAccountKey $saKey[0].Value
    $containerall = Get-AzStorageContainer -Context $saCtx
    foreach($container in $containerall){
        $bloball = Get-AzStorageBlob -Container $container.Name -Context $saCtx
        foreach($blob in $bloball){
            ## サイズが5GB以上のBLOBを出力
            if($blob.Length -gt 5000000000){
                Write-Host $blob.Name " : " $blob.Length
            }
        }
    }
}
```
”ちりつも”ですが、ここで得られた情報から大量にBLOBの削除ができれば、こちらもコスト削減の効果が見込めますので、是非トライしてみてください。

## 不要リソースがなくてもコストを下げたい！

### Azure AdvisorでRIと節約プランの購入を計画する
コスト適正化という観点では、RIや節約プランを購入する手もあります。一定の利用を事前コミットすることで、対象のリソースを安く使うことができます。この時問題になるのが「何をどれだけ購入すればいいの？」という点です。そういう時のために、__Azure Advisor__ というサービスがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/1158568e-973d-51e8-4ec4-b3aeda1bdbf7.png)

このサービスは、環境内のAzureリソース構成と利用統計情報を分析し、Azureリソースの費用対効果、パフォーマンス、信頼性、および、セキュリティの観点で推奨設定をサジェスチョンしてくれるサービスです。コストについては「RIや節約プランを購入するとこれだけ安くなる」という情報を出してくれますので、この情報を参考に購入を検討しましょう。
ちなみに節約プランの詳細については下記の記事で解説していますので興味があればご一読ください。

https://qiita.com/hiro10149084/items/b6a67546850a31218795

# おわりに
今回は、Azure環境にある不要なリソースを削除してコスト適正化を図る、をテーマに書いてみました。クラウドでは手軽にリソースが作成できてしまうからこそ、コストが膨らみがちです。定期的に環境内を見回して正しいコスト管理をしていきましょう！それでは！