Datadog で  Azure のコストを見てみよう！！🚀💰

こんにちは、アーキテクトのやまぱんです。

補足コメントや質問、<font color="red">**いいね、拡散**</font>、是非お願いします🥺！
間違ってたら<font color="red">**優しく**</font>教えてください！

-----------------------------------------------------------

今回は Azure を Datadog に連携して、コストを見てみよう！！🚀 っていう記事になります。 

普段は Azure をメインで使っていて、 Azure は人並みには知ってるけど Datadog は触ったことない人の目線で書いています。トライアル版の Datadog 環境で Cloud Cost Management を利用して検証してみました。
Azure 環境に datadog 導入を考えている人の参考になれば良いなと思います。✨

結論からいうとこんな感じで見ることができます。
私の検証環境では Azure Firewall が金食い虫だということが視覚的にわかります✨💦
また、今回は単一の  Azure Subscription の環境しか連携していないんですが、ほかの環境 (ほかの Azure サブスクリプションやマネジメントグループ単位や、AWS 環境など) も連携していたらこのダッシュボードで一元管理できるという事ですね～！

+ Datadog Cloud Cost Management × Azure
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/f5d105cc-2637-4f38-825b-803f334ecba6.png)

+ (参考) Azure のコスト分析の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/8da39e37-e197-4151-a7be-82a363bb0f61.png)



## Datadog とは
Datadog（データドッグ）とは、クラウドネイティブ時代におけるインフラ・アプリケーション・ログ・セキュリティの統合監視プラットフォーム🚀
いわゆるオブザーバビリティ系のマルチクラウドソリューションのリーディングカンパニーと理解してます。

オブザーバビリティって何？ってかたは以下の本でも読んでみてください

+ オブザーバビリティ・エンジニアリング 
https://amzn.to/4mTJpfP

> Datadog は Azure とネイティブ統合しており、以下のようなことが可能になります：
> + Azureリソースの自動ディスカバリ
> + Azureサービス（VM、AppService、Storageなど）のメトリクス連携
> + Azure Monitor / Cost Management と Datadog の併用による可視化強化


主な競合製品としては以下のようなものがあるかなと思います。
特に```New Relic```や```Dynatrace```、```New Relic```をよく聞く気がしますね。
```AppDynamics```や```Elastic```も！そしてもちろんAzure Monitor も！
というか、どれもよく聞く（笑）、マルチクラウドとかオブザーバビリティっていうのは**勢いのある熱い分野**だってことですね。

| 競合製品名                                           | 提供企業                      | 主な特徴・差別化ポイント                                         |
| ----------------------------------------------- | ------------------------- | ---------------------------------------------------- |
| **New Relic**                                   | New Relic, Inc.           | APMに特化、料金体系は使った分だけ（全データ無償 ingest）＋UI刷新               |
| **Dynatrace**                                   | Dynatrace, Inc.           | 自動化・AI解析（Davis AI）、大規模向けエンタープライズ市場に強い                |
| **Splunk Observability Cloud**                  | Splunk Inc.               | ログ・メトリクス・トレースを別サービスで強化、セキュリティ統合に強み                   |
| **Elastic Observability**                       | Elastic N.V.              | ELKスタックベース、オープンソース由来、Kibanaの柔軟な可視化                   |
| **Prometheus + Grafana**                        | CNCF + Grafana Labs       | OSS中心、柔軟なカスタマイズが可能、Kubernetesに特化した監視基盤               |
| **AppDynamics**                                 | Cisco                     | エンタープライズ向けAPM、Cisco製品連携に強み（ネットワーク可視化など）              |
| **<font color="red">Azure Monitor</font>**                               | Microsoft                 | Azureリソースの統合監視、Log AnalyticsやApplication Insightsを統合 |
| **Amazon CloudWatch**                           | AWS                       | AWSネイティブ統合、LambdaやEC2のモニタリングに最適化                     |
| **Google Cloud Operations Suite（旧Stackdriver）** | Google Cloud              | Google Cloud統合、BigQueryとの連携など                        |



## Datadog の無料トライアル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/f675dfbf-c442-4afd-be6a-7603b624c163.png)

14 日間無料トライアルを体験できます、ちなみに、**クレジットカード不要**です。
某ITベンダーとかのトライアルアカウント申込だとクレジットカード認証でコケまくるやつとかありますよね。Datadog のトライアルの場合は特にトラブルもなく、一回でアカウント作れました。

以下の URL から作ることができます。

https://www.datadoghq.com/ja/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/498e34bb-5cb5-4a9a-b5c7-8eb9ce5a6744.png)

## 環境設定手順

日本語版には対応してませんが、完成度高いなという印象です。
一部ハマりポイントはありましたが、比較的楽に構成することができました！！！

### 1.Integration to Azure
既に実施済みの環境であれば不要かと思います。
Datadog を Azure と Integration します。
連携させる設定のようなもので今回の検証でいえばいわば下準備となります。

* ドキュメントとしては以下になります。

https://docs.datadoghq.com/ja/integrations/azure/#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97



#### Datadog 側
Datadog Web Console (以後 Console) の左下部分の ```Integration``` から実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/4a4708e6-6a55-4dcc-9c49-6afb5d26f493.png)

または Cloud Cost の画面から  Azure を選択した時のこの画面から、まずは Azure Integration をするようにもリンクが張られているのでわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/093f30ed-3449-417f-9e9d-8fb9ceb8368c.png)

以下のように設定しました。
まず、Azure Portal を使ったデプロイをオススメ通りに選択し、今回の私の検証環境ではマネジメントグループに対する権限がないので [Individual Subscription] を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/eaeecd0e-35f6-4e0b-aef7-140430eeaa26.png)

続いて [Open Template] を押して、Azure Portal のテンプレートデプロイの画面へ。
[Open Template] はいわゆる ```Deply to Azure``` ボタンですね。

####  Azure 側
ここでテンプレートデプロイにをはじめる前に、別タブで Azure Portal を開いて Service Principal (エンタープライズアプリケーション) を作ります。
ここでは作るだけで ロールの追加はしなくて OK。
テンプレートデプロイ時に自動で追加されるので**逆に、Monitoring Reader role を付けてるとエラーに**なります。（私はなりました。）

Azure Portal だと Microsoft Entra ID  → 　管理 - アプリの登録  → 新規登録
その後、Microsoft Entra ID  → 　管理 - アプリの登録  → 作成した Service Principal を選択 → キーとシークレットよりシークレットを作成します。

Azure CLI だと以下のようにできます。
```bash: Azure CLI 
az ad sp create-for-rbac --name "MyEnterpriseApp" --skip-assignment
```
テンプレートデプロイの際にAzure Portal でいうところのクライアントシークレットの **値** 、Azure CLI でいうところの **password** が必要になります。作成時しか見る方法がないので忘れずにメモしておいてください。

<details><summary>クライアントシークレットの値 / password の確認方法</summary><div>
+ Azure Portal 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/0c8fadef-86b6-4e6e-9f1f-d6efacdf996a.png)

+ Azure CLI 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/f04496ca-3f20-418e-963f-90f3d0058d52.png)

</div></details>

クライアントシークレットの欄に先ほど確認した クライアントシークレットの```値``` か ```password``` を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/781c7886-bdf4-49d9-a2be-91d3278bdf05.png)

:::note
ここで新規作成でも進めるように見えるが、私の環境ではデプロイエラーが出て結局つくることになるのであらかじめ作っておいた方が良いです。Azure CLI で一発でつくっておくと楽です。
:::

ちなみにこちらが 今回利用した（consoleからリンクされていた) Template Deploy の Json ファイルです。気になる人もいるかなと。



<details><summary>Json Template </summary><div>


```Json:Deploy Template
	{
	    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
	    "contentVersion": "1.0.0.0",
	    "parameters": {
	        "location": {
	            "type": "string",
	            "defaultValue": "westus2",
	            "metadata": {
	                "description": "Resources location"
	            }
	        },
	        "servicePrincipalObjectId": {
	            "type": "String",
	            "metadata": {
	                "description": "Service principal object Id, needed for Role Assignment"
	            }
	        },
	        "servicePrincipalClientId": {
	            "type": "String",
	            "metadata": {
	                "description": "Service principal Client Id"
	            }
	        },
	        "servicePrincipalClientSecret": {
	            "type": "securestring",
	            "metadata": {
	                "description": "Service principal client secret"
	            }
	        },
	        "subscriptionsList": {
	            "type": "array",
	            "defaultValue": "[subscription().id]",
	            "metadata": {
	                "description": "Subscriptions list to monitor"
	            }
	        },
	        "subscriptionCount": {
	            "type": "int",
	            "defaultValue": "[length(parameters('subscriptionsList'))]"
	        },
	        "datadogApplicationKey": {
	            "type": "secureString",
	            "metadata": {
	                "description": "Your Datadog Application key"
	            }
	        },
	        "datadogApiKey": {
	            "type": "secureString",
	            "metadata": {
	                "description": "Your Datadog API key"
	            }
	        },
	        "hostFilters": {
	            "type": "string",
	            "defaultValue": "",
	            "metadata": {
	                "description": "Filter to include/exclude hosts"
	            }
	        },
	        "appServicePlanFilters": {
	            "defaultValue": "",
	            "type": "String",
	            "metadata": {
	                "description": "Filter to include/exclude app service plans"
	            }
	        },
	        "containerAppFilters": {
	            "defaultValue": "",
	            "type": "String",
	            "metadata": {
	                "description": "Filter to include/exclude container apps"
	            }
	        },
	        "automute": {
	            "type": "bool",
	            "defaultValue": true,
	            "metadata": {
	                "description": "Whether or not to use automute for hosts"
	            }
	        },
	        "resource_collection_enabled": {
	            "type": "bool",
	            "defaultValue": true,
	            "metadata": {
	                "description": "Collect resources for various Datadog products"
	            }
	        },
	        "cspm_enabled": {
	            "type": "bool",
	            "defaultValue": true,
	            "metadata": {
	                "description": "Enable the Cloud Security Management product"
	            }
	        },
	        "custom_metrics_enabled": {
	            "type": "bool",
	            "defaultValue": false,
	            "metadata": {
	                "description": "Whether or not to use custom metrics"
	            }
	        },
	        "datadogSite": {
	            "type": "String",
	            "defaultValue": "datadoghq.com",
	            "metadata": {
	                "description": "The datadog site, e.g. eu1.datadoghq.com"
	            }
	        },
	        "newguid": {
	            "type": "string",
	            "defaultValue": "[newGuid()]",
	            "metadata": {
	                "description": "Just a Guid to append to deployment script name"
	            }
	        }
	    },
	    "variables": {},
	    "resources": [
	        {
	            "copy": {
	                "name": "subscriptionsTemplateCopy",
	                "count": "[length(parameters('subscriptionsList'))]",
	                "mode": "Parallel"
	            },
	            "type": "Microsoft.Resources/deployments",
	            "apiVersion": "2021-04-01",
	            "name": "[concat('roleAssignSubsTpl-', parameters('newguid'), copyIndex())]",
	            "properties": {
	                "mode": "Incremental",
	                "expressionEvaluationOptions": {
	                    "scope": "inner"
	                },
	                "parameters": {
	                    "servicePrincipalObjectId": {
	                        "value": "[parameters('servicePrincipalObjectId')]"
	                    }
	                },
	                "template": {
	                    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
	                    "contentVersion": "1.0.0.0",
	                    "parameters": {
	                        "servicePrincipalObjectId": {
	                            "type": "String",
	                            "metadata": {
	                                "description": "Service principal object Id, needed for Role Assignment"
	                            }
	                        }
	                    },
	                    "variables": {},
	                    "resources": [
	                        {
	                            "type": "Microsoft.Authorization/roleAssignments",
	                            "apiVersion": "2020-10-01-preview",
	                            "name": "[guid(subscription().id, 'monitoring reader', parameters('servicePrincipalObjectId'))]",
	                            "properties": {
	                                "roleDefinitionId": "[concat(subscription().id, '/providers/Microsoft.Authorization/roleDefinitions/', '43d0d8ad-25c7-4714-9337-8ba259a9fe05')]",
	                                "principalId": "[parameters('servicePrincipalObjectId')]",
	                                "principalType": "ServicePrincipal"
	                            }
	                        }
	                    ],
	                    "outputs": {}
	                }
	            },
	            "subscriptionId": "[parameters('subscriptionsList')[copyIndex()]]",
	            "location": "[parameters('location')]"
	        },
	        {
	            "type": "Microsoft.Resources/deploymentScripts",
	            "apiVersion": "2020-10-01",
	            "name": "[concat('datadog-integration-script-', parameters('newguid'))]",
	            "location": "[parameters('location')]",
	            "kind": "AzurePowerShell",
	            "properties": {
	                "environmentVariables": [
	                    {
	                        "name": "subscription_id",
	                        "value": "[subscription().subscriptionId]"
	                    },
	                    {
	                        "name": "subscription_count",
	                        "value": "[parameters('subscriptionCount')]"
	                    },
	                    {
	                        "name": "clientId",
	                        "value": "[parameters('servicePrincipalClientId')]"
	                    },
	                    {
	                        "name": "clientSecret",
	                        "secureValue": "[parameters('servicePrincipalClientSecret')]"
	                    },
	                    {
	                        "name": "datadogApplicationKey",
	                        "secureValue": "[parameters('datadogApplicationKey')]"
	                    },
	                    {
	                        "name": "datadogApiKey",
	                        "secureValue": "[parameters('datadogApiKey')]"
	                    },
	                    {
	                        "name": "automute",
	                        "value": "[parameters('automute')]"
	                    },
	                    {
	                        "name": "resource_collection_enabled",
	                        "value": "[parameters('resource_collection_enabled')]"
	                    },
	                    {
	                        "name": "cspm_enabled",
	                        "value": "[parameters('cspm_enabled')]"
	                    },
	                    {
	                        "name": "custom_metrics_enabled",
	                        "value": "[parameters('custom_metrics_enabled')]"
	                    },
	                    {
	                        "name": "datadogSite",
	                        "value": "[parameters('datadogSite')]"
	                    },
	                    {
	                        "name": "tenantName",
	                        "value": "[subscription().tenantId]"
	                    },
	                    {
	                        "name":"source",
	                        "value": "arm_template_subscription"
	                    }
	                ],
	                "retentionInterval": "PT1H",
	                "timeout": "PT2M",
	                "containerSettings": {},
	                "cleanupPreference": "Always",
	                "azPowerShellVersion": "8.1",
	                "scriptContent": "Invoke-WebRequest -SkipCertificateCheck -ContentType \"application/json\" -Method Post -Uri \"https://api.$Env:datadogSite/api/v1/integration/azure\" -Headers @{\"Accept\"=\"application/json\"; \"DD-APPLICATION-KEY\"=$Env:datadogApplicationKey; \"DD-API-KEY\"=$Env:datadogApiKey} -Body (@{\"automute\"=[bool]::Parse($Env:automute); \"resource_collection_enabled\"=[bool]::Parse($Env:resource_collection_enabled); \"cspm_enabled\"=[bool]::Parse($Env:cspm_enabled); \"custom_metrics_enabled\"=[bool]::Parse($Env:custom_metrics_enabled); \"client_id\"=$Env:clientId; \"client_secret\"=$Env:clientSecret; \"tenant_name\"=$Env:tenantName; \"source\"=$Env:source; \"subscription_count\"=[int]::Parse($Env:subscription_count)} | ConvertTo-Json )"
	            }
	        },
	        {
	            "condition": "[not(empty(parameters('hostFilters')))]",
	            "type": "Microsoft.Resources/deploymentScripts",
	            "apiVersion": "2020-10-01",
	            "name": "[concat('datadog-host-filter-script-', parameters('newguid'))]",
	            "location": "[parameters('location')]",
	            "kind": "AzurePowerShell",
	            "dependsOn": [
	                "[resourceId('Microsoft.Resources/deploymentScripts', concat('datadog-integration-script-', parameters('newguid')))]"
	            ],
	            "properties": {
	                "environmentVariables": [
	                    {
	                        "name": "datadogApplicationKey",
	                        "secureValue": "[parameters('datadogApplicationKey')]"
	                    },
	                    {
	                        "name": "datadogApiKey",
	                        "secureValue": "[parameters('datadogApiKey')]"
	                    },
	                    {
	                        "name": "datadogSite",
	                        "value": "[parameters('datadogSite')]"
	                    },
	                    {
	                        "name": "hostFilters",
	                        "value": "[parameters('hostFilters')]"
	                    },
	                    {
	                        "name": "namespace",
	                        "value": "host"
	                    },
	                    {
	                        "name": "clientId",
	                        "value": "[parameters('servicePrincipalClientId')]"
	                    },
	                    {
	                        "name": "tenantName",
	                        "value": "[subscription().tenantId]"
	                    }
	                ],
	                "retentionInterval": "PT1H",
	                "timeout": "PT2M",
	                "containerSettings": {},
	                "cleanupPreference": "Always",
	                "azPowerShellVersion": "8.1",
	                "scriptContent": "Invoke-WebRequest -SkipCertificateCheck -ContentType \"application/json\" -Method Post -Uri \"https://api.$Env:datadogSite/api/v1/integration/azure/filtering\" -Headers @{\"Accept\"=\"application/json\"; \"DD-APPLICATION-KEY\"=$Env:datadogApplicationKey; \"DD-API-KEY\"=$Env:datadogApiKey} -Body (@{\"client_id\"=$Env:clientId; \"tenant_id\"=$Env:tenantName; \"namespace\"=$Env:namespace; \"filters\"=$Env:hostFilters} | ConvertTo-Json )"
	            }
	        },
	        {
	            "condition": "[not(empty(parameters('appServicePlanFilters')))]",
	            "type": "Microsoft.Resources/deploymentScripts",
	            "apiVersion": "2020-10-01",
	            "name": "[concat('datadog-app-service-plan-filter-script-', parameters('newguid'))]",
	            "location": "[parameters('location')]",
	            "kind": "AzurePowerShell",
	            "dependsOn": [
	                "[resourceId('Microsoft.Resources/deploymentScripts', concat('datadog-integration-script-', parameters('newguid')))]"
	            ],
	            "properties": {
	                "environmentVariables": [
	                    {
	                        "name": "datadogApplicationKey",
	                        "secureValue": "[parameters('datadogApplicationKey')]"
	                    },
	                    {
	                        "name": "datadogApiKey",
	                        "secureValue": "[parameters('datadogApiKey')]"
	                    },
	                    {
	                        "name": "datadogSite",
	                        "value": "[parameters('datadogSite')]"
	                    },
	                    {
	                        "name": "appServicePlanFilters",
	                        "value": "[parameters('appServicePlanFilters')]"
	                    },
	                    {
	                        "name": "namespace",
	                        "value": "app_service_plan"
	                    },
	                    {
	                        "name": "clientId",
	                        "value": "[parameters('servicePrincipalClientId')]"
	                    },
	                    {
	                        "name": "tenantName",
	                        "value": "[subscription().tenantId]"
	                    }
	                ],
	                "retentionInterval": "PT1H",
	                "timeout": "PT2M",
	                "containerSettings": {},
	                "cleanupPreference": "Always",
	                "azPowerShellVersion": "8.1",
	                "scriptContent": "Invoke-WebRequest -SkipCertificateCheck -ContentType \"application/json\" -Method Post -Uri \"https://api.$Env:datadogSite/api/v1/integration/azure/filtering\" -Headers @{\"Accept\"=\"application/json\"; \"DD-APPLICATION-KEY\"=$Env:datadogApplicationKey; \"DD-API-KEY\"=$Env:datadogApiKey} -Body (@{\"client_id\"=$Env:clientId; \"tenant_id\"=$Env:tenantName; \"namespace\"=$Env:namespace; \"filters\"=$Env:appServicePlanFilters} | ConvertTo-Json )"
	            }
	        },
	        {
	            "condition": "[not(empty(parameters('containerAppFilters')))]",
	            "type": "Microsoft.Resources/deploymentScripts",
	            "apiVersion": "2020-10-01",
	            "name": "[concat('datadog-container-app-filter-script-', parameters('newguid'))]",
	            "location": "[parameters('location')]",
	            "kind": "AzurePowerShell",
	            "dependsOn": [
	                "[resourceId('Microsoft.Resources/deploymentScripts', concat('datadog-integration-script-', parameters('newguid')))]"
	            ],
	            "properties": {
	                "environmentVariables": [
	                    {
	                        "name": "datadogApplicationKey",
	                        "secureValue": "[parameters('datadogApplicationKey')]"
	                    },
	                    {
	                        "name": "datadogApiKey",
	                        "secureValue": "[parameters('datadogApiKey')]"
	                    },
	                    {
	                        "name": "datadogSite",
	                        "value": "[parameters('datadogSite')]"
	                    },
	                    {
	                        "name": "containerAppFilters",
	                        "value": "[parameters('containerAppFilters')]"
	                    },
	                    {
	                        "name": "namespace",
	                        "value": "container_app"
	                    },
	                    {
	                        "name": "clientId",
	                        "value": "[parameters('servicePrincipalClientId')]"
	                    },
	                    {
	                        "name": "tenantName",
	                        "value": "[subscription().tenantId]"
	                    }
	                ],
	                "retentionInterval": "PT1H",
	                "timeout": "PT2M",
	                "containerSettings": {},
	                "cleanupPreference": "Always",
	                "azPowerShellVersion": "8.1",
	                "scriptContent": "Invoke-WebRequest -SkipCertificateCheck -ContentType \"application/json\" -Method Post -Uri \"https://api.$Env:datadogSite/api/v1/integration/azure/filtering\" -Headers @{\"Accept\"=\"application/json\"; \"DD-APPLICATION-KEY\"=$Env:datadogApplicationKey; \"DD-API-KEY\"=$Env:datadogApiKey} -Body (@{\"client_id\"=$Env:clientId; \"tenant_id\"=$Env:tenantName; \"namespace\"=$Env:namespace; \"filters\"=$Env:containerAppFilters} | ConvertTo-Json )"
	            }
	        }
	    ],
	    "outputs": {
	        "subscriptionCount": {
	            "type": "int",
	            "value": "[parameters('subscriptionCount')]"
	        }
	    }
	}  
```
</div></details>


この Json Template を見ればわかりますが、このテンプレート デプロイ のなかに **Datadog 用サービスプリンシパルに「Monitoring Reader」ロールを Azure サブスクリプションに割り当てる処理がある**ことがわかります。

```json
 "resources": [
	                        {
	                            "type": "Microsoft.Authorization/roleAssignments",
	                            "apiVersion": "2020-10-01-preview",
	                            "name": "[guid(subscription().id, 'monitoring reader', parameters('servicePrincipalObjectId'))]",
	                            "properties": {
	                                "roleDefinitionId": "[concat(subscription().id, '/providers/Microsoft.Authorization/roleDefinitions/', '43d0d8ad-25c7-4714-9337-8ba259a9fe05')]",
	                                "principalId": "[parameters('servicePrincipalObjectId')]",
	                                "principalType": "ServicePrincipal"
	                            }
	                        }
	                    ],
```


```Datadog API Key```と```Datadog Application Key```は Datadog Console のこちらから確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/4518f4fa-930a-4bc3-90b6-3177348cc467.png)

#### で、デプロイ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/eac319fc-a558-4ec2-8bed-40456a616694.png)
(Service Principal が ```datadogSP```になっていますが、なんどかやり直したこともあり、```datadogApp```でこれ以降実施しており、その部分は読みかえてくださいm( __ __ )m)

デプロイが完了すると console 側から、 Azure 環境が見えるようになります。

#### Datadog 側
 Azure 環境が Integration されたことがわかります。
 画面を更新しながら待ちましょう、私の環境では１分以内に確認することができました。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/e1e37706-b6d4-42ab-9cbf-5f614276f775.png)

これにて無事 **Integration to Azure 完了！！**

### 2.Cloud Cost Management for Azure の設定
おそらく、Azure Cost Management からエクスポートされた「Actual」や「Amortized」のコストデータ（CSV形式）を、Datadog アプリ がAzure Storage コンテナに保存されたファイルから定期的に読み取り、自動的にメトリクスとして取り込む仕組みになっているようです。
定期的に読み取り、自動でメトリクス化する仕組みで取得してるっぽい。

どのタイミングでできたのかわからないけど、構成を終えると Microsoft によって管理されている```datadog-``` のエンタープライズアプリケーションが存在してました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/6315f495-104e-494b-ad50-98c0654b51de.png)

やりたいことは cosole → Cloud Cost からこちらを表示させる！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/891743b9-2ccd-4223-ac1c-747a83b47f82.png)



+ 公式ドキュメントはこちら

https://docs.datadoghq.com/ja/cloud_cost_management/setup/azure/?tab=subscriptionsresourcegroups

#### コストのエクスポート設定 (Azure )


+ コストの管理と請求  → レポート + 分析 -エクスポート から設定します。
下の画面ショットはすでに作ったあとに画面ショットを取ったので既に存在しています。（上の２つです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/55a704da-f962-4fd4-b9c4-af5ef86be3e2.png)

今回、スコープはサブスクリプションにしています。（スコープは課金アカウントかサブスクリプション、リソースグループのいずれかである必要があります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/b1d3add6-3b93-4440-b456-fc32f7f38bb4.png)

+ 設定画面の遷移としては以下のような感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/bcd34688-102a-4042-b4c6-7a74316c9110.png)
詳細はドキュメントよんでいただければと思います。
私はここで データの上書きを```オン```にしてしまってあとでエラーがでて時間を溶かしてしまいました。
ドキュメントにもちゃんと書いてますが、データの上書きを```オフ```にしましょう。


#### Service Principal への権限設定 (Azure )
+ Storage Blob Data Reader (ストレージ BLOB データ閲覧者)
該当のストレージ アカウント → アクセス制御(IAM)  → 　追加 から追加します。
Integrationするときに作成した Service Principal にエクスポート先に設定したストレージ アカウント(Azure Blob Storage)へのアクセス権、```Storage Blob Data Reader (ストレージ BLOB データ閲覧者)```を設定します。

なお既に```Monitoring Reader (監視閲覧者)``` は Integration したときに付与されているはずなので権限設定後は以下のようになります。(該当のストレージ アカウント → アクセス制御(IAM)  → 　追加 から 確認した場合)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/ae4ea391-7438-4efd-87b0-c9d675b2c38b.png)

+ Cost Management Reader (コスト管理の閲覧者)
該当のサブスクリプション  → アクセス制御(IAM)  → 　追加 から追加します
Integrationするときに作成した Service Principal に```Cost Management Reader (コスト管理の閲覧者)```を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/bd09d5f0-bed3-43df-8588-97b428e56702.png)


#### Datadog 側
ここまでできたらここにそれぞれ必要な情報を入力して進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/6b0d6904-5548-439b-90ca-88707e0bc48c.png)

問題なければ以下のような画面になるかなと思いますが！（私は何回か詰まってしまいましたが)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/62f51ec8-7475-45d0-941d-3d83611f231d.png)

ここまでできたなら、Azure Portal 側で手動でエクスポートしてしばらく置いておきます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/d63cd8b2-9563-4687-939c-c8aacdb2d884.png)


## 結果 （画面ショットなど）
一晩寝かして、結果を確認します。

https://ap1.datadoghq.com/cost/overview/summary

参考にいくつか画面ショットを


### 結果 - Cloud Cost
まずはコスト関連
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/d8b3afab-6668-4b99-926b-7723dd21baab.png)

コスト削減のための推奨事項まででているのは面白いです！（１日後でも出ていました）

:::note
どこから、どういう情報をもとにこの推奨事項をだしてるのかは気になります。
今回、コスト削減の推奨事項としてでている、データディスクに関しては Azure VM と紐づけているので、紐づいていないから未使用(Azure Resource Graph的なものでリソースの紐づきを確認している)だと判断しているわ訳ではなさそう？ってなると過去のメトリックから判断しているのかなと推察。
:::

### 結果 - Infrastructure 
こちらからは今回の記事の要旨ではないですが、 Infrastructure のブレードです。
+ Infrastructure - オンプレマシン
まず、オンプレの Windows Server です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/972643cf-d1a3-4949-ba00-be571baf604b.png)
jam は私の自宅環境にある Windows Server でそこに Datadog の Agent を入れています。
各種メトリックは見れるのは想定の範疇ですが、**Azure Arc に登録していることまでわかる**のは予想外でした！！
+ Infrastructure - Azure VM 
つづいて、 Azure VM です。Azure VM をAzure Portal から起動して10分程度で表示されるようになりました。(Azure VM にはdatadog Agent は入れていません、 Azure のプラットフォームメトリックをみてると思います。たぶんエージェントを入れた方が早く表示される気がします。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/f9a06800-2dab-4dce-9952-7dfdd0e9219d.png)
タグ情報としてリソースID的な情報群や Availability Zone、OS情報なども確認することができます。

## 参考
+ Cloud Cost Management Demo - Youtube

https://www.youtube.com/watch?v=tihSuZ0gLcg&t=302s

+ 公式ドキュメント

https://docs.datadoghq.com/ja/cloud_cost_management/setup/azure/?tab=subscriptionsresourcegroups

+ Datadog のいいところ、悪いところ
コストが高めなようです。それ以外にはなさそうです。

https://qiita.com/op_yamaguchi/items/29c70269689d38d3081e

+ 【初心者向け】Datadogエージェントをインストールしてみた！やり方・注意点まとめ【Linux編】
エージェントのインストールもしてみましたがとても簡単でしたし、すでに APC の方がブログを書かれていましたので共有します。

https://techblog.ap-com.co.jp/entry/2025/03/10/110648


## ✅ まとめ

今回は **Azureのコスト情報をDatadogと連携して可視化する方法**を検証・紹介しました。

- **Azure Cost Managementのエクスポート機能**を利用して、DatadogのCloud Cost Managementにコストデータを取り込むことで、Azureポータルでは見えにくかった **コストの傾向や無駄** が視覚的に把握できるようになりました。
- 設定には以下のポイントが重要です：
  - AzureとDatadogの**インテグレーション（統合）設定**
  - Datadog用の**Service Principal作成と適切なRBACロール付与**
    - `Monitoring Reader`
    - `Storage Blob Data Reader`
    - `Cost Management Reader`（必要に応じて）
  - Azure Cost Managementでの**エクスポート定義作成（Amortized/Actual）**
  - エクスポートされたCSVの**ストレージへの保存とDatadogによる取り込み**

また、DatadogのCloud Cost Managementは **複数のAzureサブスクリプションやAWS環境などその他クラウドとの統合にも対応**しており、マルチクラウドなコスト管理が可能になる点も非常に魅力的です。


---

### 🧠 さいごに

- **AzureユーザーだけどDatadog初体験**という方にも、比較的シンプルに導入できる構成だったと思います。
- コスト最適化の第一歩は「**まずは可視化すること**」。Datadogのビジュアライズ能力はその強力な武器になります。
- 無料トライアルは**クレカ登録不要で始められる**ので、ぜひ試してみてください！

---

こんにちは、アーキテクトのやまぱんでした！  
ここまで読んでいただきありがとうございます🙌  
**「いいね・拡散」** や **「コメント」** で応援いただけるととっても嬉しいです！

「ここ違うよ！」とか「もっといいやり方あるよ！」ってのがあれば、ぜひ**やさしく教えてください**✨  
また、 Azure とほかのソリューションとの連携や他クラウドとの組み合わせ検証なども今後記事にしていきたいと思います(トライアル版があるものに限りますｗ)！！
いいネタがあれば教えてください！