HerokuとMackerelでクラウドの課金監視

[Vagrant](https://www.vagrantup.com/)や[Terraform](https://www.terraform.io/)などのツールの発達により、クラウド上への仮想マシンのデプロイが簡単にできるようになってきました。しかし、つい作りすぎたり、消し忘れで思わぬ課金をされてしまった経験はないでしょうか？

今回はこのような事態を防ぐため[Heroku](https://heroku.com)と[Mackerel](https://mackerel.io)を使って課金の監視を行ってみます。

# 背景

各プロバイダでは予算管理機能として請求額に閾値を設定し、閾値を超過したらアラートで通知する機能が提供されています。

* [アラートと通知で請求額を監視 - AWS 請求情報とコスト管理](http://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/monitor-charges.html)
* [Never Get Surprised By Your Monthly Invoice Again! | DigitalOcean](https://www.digitalocean.com/company/blog/never-get-surprised-by-your-monthly-invoice-again/)
* [IDCFクラウド |「003予算設定はできますか？」よくあるご質問 | IDCフロンティア](http://www.idcf.jp/cloud/faq/bil_003.html)

しかし、月額で閾値を設定しているケースが多く通知の頻度も低いため、通知がきた時点で閾値を何倍も超過しているなど手遅れになっていることがありえます。
たとえば、通常月額500円程度の仮想マシンを使用しており数千円程度の閾値を設定していたとしましょう。この場合、高額な仮想マシンを使用すると1日で閾値を超過してしまい、通知が間に合わないかもしれません。

今回は月額の監視を補完するため、現時点で存在するリソースの従量課金額の合計に閾値を設定し、より細かい頻度で監視してみたいと思います。
先ほどの高額な仮想マシンを作成したケースでも、1時間に数百円以上課金されていると気づければ、仮想マシンを削除する・スペックを落とす等の対策をとることができるでしょう。
特に、1つのアカウントを複数のユーザーで使用している場合やオートスケーリングを実施している場合には有効だと思います。

# HerokuとMackerelによる課金監視

今回は従量課金額の監視にHerokuとMackerelを使ってみました。
これらを選んだのは次のような理由からです。

* Heroku、Mackerelの無料プランで実現可能
* 簡単にデプロイ可能
* なるべくサーバーの構築・運用をしたくない
* Mackerelのアラート機能が使いやすい
    * GUIによるアラート設定
    * メール以外にもSlack等による通知が可能
* グラフにより課金額の時間変化を追う事が可能
* グラフをWikiなどに埋め込みチームで共有することが可能

# IDCFクラウドでの実装例

例としてIDCFクラウドの課金の監視を実施してみます。
[fog](http://fog.io/)を使用して実装しているため、他のクラウドへの対応も容易だと思います。

https://github.com/atsaki/idcfcloud-billing-monitor

## 使い方

### IDCFクラウド・MackerelのAPI情報の取得

下記ドキュメントを参考にIDCFクラウドのAPIキー、シークレットキー、MackerelのAPIキーを取得します。

* [IDCF ドキュメント](http://docs.idcf.jp/cloud/introduction/#first-use)
* [API仕様（v0） - Mackerel ヘルプ](http://help-ja.mackerel.io/entry/spec/api/v0)

### Mackerelにサービスメトリクスを受け取るサービスを作成

Mackerelにメトリクスを受け取るためのサービスを作成します。

* [サービス、ロールを作成する - Mackerel ヘルプ](http://help-ja.mackerel.io/entry/howto/create-services-and-roles)

デフォルトでは「idcfcloud」という名前のサービスを使用します。
既存のサービスを使用する事も可能です。

### Herokuボタンからデプロイ

[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/atsaki/idcfcloud-billing-monitor)

ボタンを押した後、取得したIDCFクラウド、Mackerelの設定を入力してデプロイしてください。（App Nameは空白にすると適当な名前をつけてくれますが、分かりやすい名前を入れておいた方が後で管理が楽です。）

![スクリーンショット 2015-02-23 11.44.03.png](https://qiita-image-store.s3.amazonaws.com/0/15114/874c359d-ad60-7a0a-cc83-8bc072bc06d3.png)

### dynoの設定

デフォルトではモニタ用のプロセスにdynoが割り当てられていないので、ダッシュボードから作成したAppを選択し、Resourcesタブから下図のようにweb=0、monitor=1に設定します。

![スクリーンショット 2015-02-23 11.47.45.png](https://qiita-image-store.s3.amazonaws.com/0/15114/195ffffa-587a-5f74-849d-ddb51dd88eab.png)


### Mackerelのサービスメトリクスの確認

ここまでが上手くいっていれば数分でMackerelに値が反映されてきます。

デフォルトでは積み重ねグラフになっていますが、月額と時間当たりの金額を足しても意味がないので、グラフの右上の歯車から設定を折れ線グラフに変更しておくとよいでしょう。


![スクリーンショット 2015-02-22 14.52.50.png](https://qiita-image-store.s3.amazonaws.com/0/15114/c4032c05-6e12-8949-763a-edf27fa37c18.png)

![スクリーンショット 2015-02-23 11.39.11.png](https://qiita-image-store.s3.amazonaws.com/0/15114/bcfdb4e0-5029-869c-edfc-d9dbd2844b19.png)

指標としては監視を実施した時点で存在するリソースの「時間あたりの従量課金額の合計」と「月額上限額の合計」を使用しています。上の例ではlightS1が2台あり、1時間2*2=2円、月額の上限500*2=1000円となっています。

何も表示されない場合には、入力した情報に間違いがないか確認してみましょう。
herokuコマンドが使える場合には、```heroku logs``` コマンドを使って原因を調べることができます。

```bash
$ heroku logs --tail --app YOUR_APP_NAME
``` 

### アラートの設定

閾値と通知方法を設定します。

* [監視・通知を設定する - Mackerel ヘルプ](http://help-ja.mackerel.io/entry/howto/alerts)

下図は月額上限額に750円の閾値を設けて、slackに通知した様子です。
仮想マシンを消し月額が閾値を下回った際も通知されていることがわかります。

![スクリーンショット 2015-02-22 15.43.12.png](https://qiita-image-store.s3.amazonaws.com/0/15114/44a2609f-1ccf-9715-0f84-0bf8a825f6b6.png)

# 注意点

今回の例では2つの指標をMackerelのサービスメトリクスとして投稿しています。
Mackerelの無料枠では投稿できるサービスメトリクスは5つまで、データの保持期間は1日（IDCFクラウドアカウント連携をしていれば1週間）という制限があります。
アラートを上げるには十分だと思いますが、記録用には不足しているので別の方法を考えた方がよいでしょう。

（ホスト1台当たり月額2000円ですが、ホストを0台にしてサービスメトリクスのみを利用ということはできないようです。）

# 最後に

いままでHerokuを使ってなかったのですが、今回触ってみて非常に便利でした。色々なケースで使えそうなので、今後も積極的に使っていきたいと思います。