[Grafana] Grafanaで、AWSのリザーブドインスタンス（RI）を監視してみた。

こんにちは。
最近開発にも手を出し始めた元インフラのjkkitakita。

とりあえず
何か書きたい衝動に駆られたので
ちょっと前に、遊び感覚でやっていたことをつらつらと。

## はじめに
ざっくりでも以下の知識があるとよいかも。

1. リザーブドインスタンス
    - [リザーブドインスタンスとは何ですか？](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/reserved-instances-fundamentals.html)
    - [AWS Black Belt Online Seminar AWSのコスト削減オプション](http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-aws-67269475)
2. [Grafana + Influxdb](http://qiita.com/chroju/items/355f3c6da9f8c4867ba5)
3. [telegrafのExec Input Pluginについて](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/exec)

## 各種サービスのバージョン
- Telegraf - Version 0.10.3
- InfluxDB shell 0.10.3
- Grafana v 2.6.0

## 背景
1. EC2、RDS、Redshiftの台数が増えてきて、コストが結構かかる。
2. Trusted Advisorを見れば、現状の最適化は検討できるが、次いつリザーブドを購入すればいいのか把握したい。（cf. 会社のキャッシュフロー）
3. <font color="Red">現状のオンデマンド/リザーブドの比率をグラフで一目で確認したい。</font>

特に3.が大きい。
「毎月1回、EC2の画面を見て、1日かけて確認する」
的な運用でカバーはまず論外で

その他、頑張ってやろうとすると
- Cost Visualizerを導入する
https://dev.smt.docomo.ne.jp/?p=common_page&p_name=cost_visualizer
- エクセルとかで、毎日編集する

とかって話になって、それはそれで、コスト・手間がかかる。
ぶっちゃけ、これもだるい。めんどくさい。（笑）

めんどくさいなーめんどくさいなーと
ボソボソ言いながら、ふと

「もうサーバーの傾向監視を
telegraf + influxdb + Grafanaでやってるから
RIもそこに入れて、ダッシュボードにしちゃえ！！！！」

ってことで
取り急ぎ、telegraf + bashでいけそうだったので
telegrafの設定開始(｀・ω・´)ｷﾘｯ

## telegrafの設定してみる

とりあえず、confにinput.execを追記。

```/etc/telegraf/telegraf.conf

# EC2
[[inputs.exec]]
  command = "/etc/telegraf/telegraf.d/exec/count-instances"
  data_format = "influx"
  interval = "3600s"

[[inputs.exec]]
  command = "/etc/telegraf/telegraf.d/exec/reserved_instance.sh"
  data_format = "influx"
  interval = "3600s"

# RDS
[[inputs.exec]]
  command = "/etc/telegraf/telegraf.d/exec/rds_reserved_nodes.sh"
  data_format = "influx"
  interval = "3600s"

# Redshift
[[inputs.exec]]
  command = "/etc/telegraf/telegraf.d/exec/redshift_reserved_nodes.sh"
  data_format = "influx"
  interval = "3600s"
```

あとは、bashをちょこちょこ書くだけ。

■ EC2
1.全体（オンデマンドとリザーブド）の数

```/etc/telegraf/telegraf.d/exec/count-instances.sh
#!/bin/bash

### check instance status is running
/usr/bin/aws ec2 describe-instances --filters "Name=instance-state-name,Values=running" |
jq -r  '[ .Reservations[] | .Instances[] | { InstanceType } ]| group_by(.InstanceType) | .
[]|.[0] + { "Count": length}| .InstanceType, .Count'|sed 'N;s/\n/ value=/'|sed 's/^/instan
ces,instance_type=/'
```

2.リザーブドの数

```/etc/telegraf/telegraf.d/exec/reserved_instance.sh
#!/bin/bash

/usr/bin/aws ec2 describe-reserved-instances --filters "Name=state,Values=active" | jq -r
'.ReservedInstances[] | [.InstanceType, .AvailabilityZone, (.InstanceCount|tostring), .End
] | join(",")' | sed 's/T.*//g' | awk -F, '{print "reserved_instances,instance_type=" $1 "
,AvailabilityZone=" $2 ",end_date=" $4 " RI_count=" $3}' | sed 's/=,/=-,/g'
```

■ RDS
・全体（オンデマンドとリザーブド）とリザーブドの数

```/etc/telegraf/telegraf.d/exec/rds_reserved_nodes.sh
#!/bin/bash

# count of rds db instaces group by instance_type
/usr/bin/aws rds describe-db-instances --output json | jq -r '[.DBInstances[] | { DBInstan
ceClass }] | group_by(.DBInstanceClass) | .[] | .[0] + { "Count": length } | [.DBInstanceC
lass, (.Count|tostring)] | join(",")' | sed 's/^/rds_db_instances,db_instance_type=/g'| aw
k -F, '{print $1 "," $2 " values=" $3}'

# count of reserved rds db instances group by instance_type
/usr/bin/aws rds describe-reserved-db-instances --output json | jq -r '.ReservedDBInstance
s[] | select(.State == "active") | [.DBInstanceClass, (.DBInstanceCount|tostring), .StartT
ime] | join(",")' | sed -E 's/^(.*T.*)\..*$/\1/g' | awk -F, '{print "rds_reserved_instance
s,db_instance_type=" $1 ",start_time=" $3 " RI_count=" $2}'
```

■ Redshift（dc1.largeのみ）
・全体（オンデマンドとリザーブド）とリザーブドの数

```/etc/telegraf/telegraf.d/exec/redshift_reserved_nodes.sh
#!/bin/bash

# count of redshift nodes
/usr/bin/aws redshift describe-clusters --output json | jq -r '[.Clusters[] | select(.Node
Type == "dc1.large") | .NumberOfNodes] | add' | sed 's/^/redshift_cluster_nodes,node_type=
dc1.large values=/g'

# count of reserved redshift nodes
/usr/bin/aws redshift describe-reserved-nodes --output json | jq -r '.ReservedNodes[] | se
lect(.State == "active") | [.NodeType, (.NodeCount|tostring), .StartTime] | join(",")' | s
ed -E 's/^(.*T.*)\..*$/\1/g' | awk -F, '{print "redshift_reserved_nodes,node_type=" $1 ",s
tart_time=" $3 " RI_count=" $2}'
```

jq,sed,awkでワンライナーでごり押し。（笑）

もっといい感じにかけるはずだけど
まぁ一旦現状、こんな感じでいけそう。

telegrafの再起動。

```
/etc/init.d/telegraf restart
```

InfluxDBの中身確認してみる。
とりあえず、うまくいってそう。

- EC2

<img width="576" alt="influxdb_instances.png" src="https://qiita-image-store.s3.amazonaws.com/0/95804/ef88ee6e-50fb-3fdd-0d1c-b488a796fae2.png">

<img width="800" alt="influxdb_reserved_instances.png" src="https://qiita-image-store.s3.amazonaws.com/0/95804/448cbf25-fd0d-b046-b01f-47944b7dd893.png">

- RDS

<img width="632" alt="influxdb_rds_instances.png" src="https://qiita-image-store.s3.amazonaws.com/0/95804/acedb20b-f9af-cb2f-2307-a16a4e4c7cfa.png">

<img width="764" alt="influxdb_rds_reserved_instances.png" src="https://qiita-image-store.s3.amazonaws.com/0/95804/7e87d7b4-cb15-e4b2-bc11-ea58b11c74db.png">

- Redshift

<img width="569" alt="influxdb_redshift_nodes.png" src="https://qiita-image-store.s3.amazonaws.com/0/95804/bad40a46-a704-094c-1334-d1b7a4fdbf03.png">

<img width="769" alt="influxdb_redshift_reserved_nodes.png" src="https://qiita-image-store.s3.amazonaws.com/0/95804/5c82ac77-aa57-47e7-2827-f56f85c03904.png">



## Grafanaでダッシュボードつくる

1.各種サービスのリザーブド終了日付を一覧で把握
<img width="1279" alt="Grafana_RI_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/95804/1097e312-5c13-cd43-a66b-6e0ee3c22079.png">


2.各種サービスのリザーブド数の傾向監視（EC2は、インスタンスタイプ毎）<font color="blue">- オンデマンド　</font><font color="Red">- リザーブド</font>
<img width="1274" alt="Grafana_RI_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/95804/53aeda30-7a94-cb95-22f2-9dc7237370b1.png">



お、おう。。。めっちゃコスト削減できそう。。。
とりあえず、私の給料分の何倍かは。。。笑

## さいごに
やはり、なんかあったら、Grafanaが一番。笑
特にモニタリングするには。

しかも
[Kapatitor](https://docs.influxdata.com/kapacitor/v1.2/)とか使えば
AWSサービスとか他のSaaSではできない
詳細なコスト監視も実現できそうなので
本格的に運用する気持ちになったらやってみようと思います！