DatadogでAWS利用料金の推移を可視化する

# 背景

Excelにコピペするのは嫌でござる！LambdaもTerraformも書きとうない！Datadogならポチポチだけでできるはずだ！

* https://qiita.com/search?q=aws+billing

# 準備が5つ必要です

ポチポチだけでイケた。AWSとDatadogすごい。神。

## 準備1: AWSでBudgetを作成する

AWS請求ダッシュボードにある「Budget」で、雑でも何でもいいので、「予算を作成」してください。もうあるなら、この準備は飛ばして大丈夫です。

作成が必要な理由は、Datadogは、Budget経由でBillingのデータを吸い出しているため、Budgetがとにかく存在してないと始まらないのです。

ちなみに予算を作ったところで、予算を超えると何も動かなくなるとか、予算の金額を毎月必ず請求されるとか、そんなことは一切ないです。AWSからの請求に対して、予算という枠組みで分析したり通知させるための仕組みです。

予算はこんな感じで作成しました。ちゃんと活用してる方からは石を投げられるんじゃなかろうか....

* 予算タイプは「コスト予算」
    * 名前は「月別AWS予算」
    * 間隔は「月別」
    * 予算は、前月実績に+20%くらいの金額をテキトーに入れておきます
    * 定期予算
    * フィルタリングは無し。include all。
    * 非ブレンドコスト
    * 含められる関連コストは、すべてチェック
    * アラートもテキトーに組む

## 準備2: AWSでIAM権限を付与する

IAM権限 ```budgets:ViewBudget``` を、Datadogのロールに付与します。もう付与してあるなら、この準備は不要です。DatadogのAWSインテグレーションを、以下マニュアルの「All Permissions」で提示されるIAM権限で設定してれば含まれてますが、改めてご確認ください。

* https://docs.datadoghq.com/integrations/amazon_web_services/

## 準備3: Billingの設定で「請求アラートを受け取る」にチェックして保存

これをチェックして保存すると、バージニア北部リージョンのCloudWatchに、Billingのメトリクスとして EstimatedChargesが作られて、Datadogで aws.billing.estimated_charges として、利用サービス毎の料金を取れるようになります。

<img width="506" alt="スクリーンショット 2019-08-06 11.49.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22947/e033c34b-b63a-3da6-b9ce-a368cdd284b7.png">

## 準備4: DatadogでAWS Billingインテグレーションを有効化する

Datadogがマニュアルを用意してくれてます。

* https://docs.datadoghq.com/integrations/amazon_billing/

有効化後、これを書いてる今も Broken ですが、AWSからデータを取れてるので気にしなくていいです。

<img width="236" alt="スクリーンショット 2019-05-03 19.42.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22947/51feac5e-45d2-de41-ff47-0ecd869f6051.png">

## 準備5: 一晩くらい待つ

請求関連のメトリクスは更新頻度が少なく、日に数回らしいです。ここまでの準備しても、Datadogでまとまった量のデータが最初に見えるようになるのは、一晩くらい経ってからです。焦らず待ちましょう。

# Datadogで可視化する

これで可視化できます。AWSから吸い出してるメトリクスは4つですが、「by」で切り口にできる、何ていうんですかあれは、あれがあるので、めちゃめちゃ面倒くさい願望をぶつけなければ、大体なんとかなる気がします。

* aws.billing.budget_limit
* aws.billing.actual_spend
* aws.billing.forecasted_spend
* aws.billing.estimated_charges

## 利用料金の推移のグラフ

こんなグラフが作れます。積み上がってるのは費目で、EC2, RDS, DataTransfer,,,毎に出ます。メトリクスの性質として、月末締めで一旦ゼロになります。

![IMG_0251.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22947/87af60d7-093c-1761-b5c1-b84a4282888b.jpeg)

グラフのJSONはこのように。aws.billing.estimated_charges を servicename 毎にやるのがミソですね。ソートしてほしい。

```json
{
  "viz": "timeseries",
  "requests": [
    {
      "q": "sum:aws.billing.budget_limit{*}",
      "type": "line",
      "style": {
        "palette": "dog_classic",
        "type": "dashed",
        "width": "normal"
      },
      "aggregator": "avg",
      "conditional_formats": []
    },
    {
      "q": "sum:aws.billing.actual_spend{*}",
      "type": "line",
      "style": {
        "palette": "dog_classic",
        "type": "dashed",
        "width": "normal"
      }
    },
    {
      "q": "sum:aws.billing.forecasted_spend{*}",
      "type": "line",
      "style": {
        "palette": "dog_classic",
        "type": "dashed",
        "width": "normal"
      }
    },
    {
      "q": "sum:aws.billing.estimated_charges{*} by {servicename}",
      "type": "area",
      "style": {
        "palette": "cool",
        "type": "solid",
        "width": "normal"
      }
    }
  ],
  "autoscale": true
}
```

## 利用料金 Top 10

aws.billing.estimated_charges を servicename 毎に、こちらは利用料金の多い順にソートされてます。注意として、ダッシュボードの表示期間が月をまたいでる場合、先月と今月の金額が混ざります。select rangeでイイ感じに調整して見てください。

![IMG_0250.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22947/cc6f0fe9-875f-98b1-e8fa-5555a1e2c29a.jpeg)

JSONはこのように。

```json
{
  "viz": "toplist",
  "requests": [
    {
      "q": "top(sum:aws.billing.estimated_charges{*} by {servicename}, 10, 'mean', 'desc')",
      "type": null,
      "style": {
        "palette": "dog_classic",
        "type": "solid",
        "width": "normal"
      },
      "conditional_formats": []
    }
  ]
}
```

## さらに凝った可視化をするには

AWS側の予算で分析軸を作れるのと、Datadog側のダッシュボードやグラフの仕組みで可視化できるので、物事に限度はありますが頑張れるのではないでしょうか。

# Datadogで監視＆通知する

ところでDatadogにメトリクスが来ているので、Datadogで監視＆通知できます。AWS Budgetの仕組みでも監視と通知ができます。が、メトリクスの動きに対して、DatadogではAnomary Detectionなど凝った監視ができるので、活用するといい、はずだ！

* https://docs.datadoghq.com/ja/guides/anomalies/