こんにちは! 名古屋スタジオでサーバーエンジニアをやっている 五田 です!
みなさんはAWSの負荷監視はどのようにやってますか?
弊社ではAWS標準で用意されている、Amazon CloudWatch(以下、CloudWatch)を使って監視をしています。
通常のリアルタイム監視においては、1分単位でサーバーの負荷状況を見ることができ、
監視項目やグラフといった標準で充分なぐらい機能がついているのですが、
使っているとどうしてもかゆいところが出てきました…
かゆいところ、それは… CloudWatch Metricsの保存期間の制約
CloudWatchでは、最大15ヶ月データが保持されるのですが、
残してもらえるMetricsの精度が
- 1 分ごとのデータポイントを 15 日間保存
- 5 分ごとのデータポイントを 63 日間保存
- 1 時間ごとのデータポイントを 455 日間保存
の3パターンになっていて、長期間保存するにつれて徐々に精度が落ちていきます。
この制約で困ること
ひとことでいうと、"振り返りができない" ことです。
ソーシャルゲーム運用では、「◯周年」のような大きなイベントをした際に、ユーザー様が集中してサーバーがダウンしてしまったということを回避するため、過去の実績を大いに参考にします。
「去年やった◯◯の時ってどれぐらいだったっけ…」といった時に、1時間の粒度だと丸められてしまっていて、振り返ることができず、今後のサーバー台数の計画を立てることができません。
※AWSには自動でスケーリングしてくれる機能がありますが、瞬間的な負荷集中には弱い…
そこで今回は、1分の精度で1年前でも振り返られるようにすることで、当時の実績から今後の負荷状況を推測できるようにしたいと思います。
本題
今回、InfluxDB+Telegraf+Grafanaで解決してみることにしました。
ググってみると同じ構成を考えている方も結構いらしゃっていて、「Fluentd + Elasticsearch + Kibana」みたいな黄金トリオ感を感じます(笑)
- InfluxDB
- 時系列DB
- 今回は、CloudWatchのデータを時系列に保管するために使用
- Telegraf
- InfluxDBにデータを入れるためのメトリクスコレクタ
- CloudWatchのAPIを叩いて定期的にデータを収集させる
- Grafana
- ログやデータを可視化するツール
- kibana とよく似た感じ
- InfluxDBに溜め込まれた時系列データを、いい感じに可視化する
さっそく使ってみる
物理的にインストールしてもよかったのですが、それぞれDockerのImageが用意されていたので、 docker-compose.yml
を書いて起動してみました。
※Docker for Mac等でも動きます
version: '3'
services:
influxdb:
image: influxdb:latest
ports:
- "8083:8083"
- "8086:8086"
volumes:
- ./volumes/influxdb/var-lib-influxdb:/var/lib/influxdb
environment:
TZ: Asia/Tokyo
telegraf:
image: telegraf
links:
- influxdb
volumes:
- ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
links:
- influxdb
environment:
GF_AWS_PROFILES: default
TZ: Asia/Tokyo
volumes:
- ./volumes/grafana/var-lib-grafana:/var/lib/grafana
- ./grafana/grafana.ini:/etc/grafana/grafana.ini
Telegrafの設定は公式のドキュメントを参考に作成しました。
https://github.com/influxdata/telegraf/tree/master/plugins/inputs/cloudwatch
▼設定例(telegraf.confに追記)
取得したいメトリクスごとに設定に追加していきます。下記の例はRDSのメトリクス取得例です。
[[inputs.cloudwatch]]
region = "ap-northeast-1"
access_key = "access_key"
secret_key = "very secret_key"
period = "1m"
delay = "1m"
interval = "5m"
#cache_ttl = "10m"
namespace = "AWS/RDS"
ratelimit = 100
Grafana
http://{Grafana稼動ホスト/IP}:3000
にアクセスして初期設定を行う- 「設定」→「Data sources」から「Add data source」し、「InfluxDB」を選択
- ダッシュボードを作って可視化する!(ここが一番時間かかった…)
作ってみて
- InfluxDBへのアクセスは思った以上に高速でGOOD! Grafanaで表示する期間を広げてもサクッと表示される
- 1分単位の粒度を(ディスク容量が許す限り)無限に残せて、振り返りがすごく楽に&精度が高いものになった
- Teregrafの設定でCloudWatchへの参照頻度を上げすぎると、CloudWatchの利用料が増えちゃうので注意。5分ごとに1分の精度で取得、ぐらいが安心。
- 副産物でGrafanaの「アラート」機能をつかって、Slackにアラートを画像つきで飛ばせるようになった
まとめ
駆け足になりましたが、時間が経ってもCloudWatchの制約をうけずに1分の精度で振り返る仕組みづくりをご紹介しました。
実際の導入もだいたい1時間ぐらいでおわり、グラフもカッコいい(ここ重要)なのでとても満足です!
それでは、よいAWSライフを!