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


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

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

はじめに

ざっくりでも以下の知識があるとよいかも。

  1. リザーブドインスタンス
  2. Grafana + Influxdb
  3. telegrafのExec Input Pluginについて

各種サービスのバージョン

  • Telegraf - Version 0.10.3
  • InfluxDB shell 0.10.3
  • Grafana v 2.6.0

背景

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

特に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

  • RDS

  • Redshift

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

1.各種サービスのリザーブド終了日付を一覧で把握

2.各種サービスのリザーブド数の傾向監視(EC2は、インスタンスタイプ毎)- オンデマンド - リザーブド

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

さいごに

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

しかも
Kapatitorとか使えば
AWSサービスとか他のSaaSではできない
詳細なコスト監視も実現できそうなので
本格的に運用する気持ちになったらやってみようと思います!