CloudWatchとcollectdでLoadAverageのグラフを作成する

AWS運用自動化サービス「Cloud Automator」

EC2インスタンスのLoadAverageをCloudWatchでグラフ化しようとして諦めた方はいますか。
CloudWatch単体ではできませんが、collectdと連携すると可能になります。

1. 前提

CloudWatchはEC2インスタンスのメトリクスを、どこかから収集する必要があります。

1-1.ハイパーバイザーから収集可能なメトリクス

CPU使用率やDiskIO、NetworkIOなどは、AWSが自動的にハイパーバイザーから収集するので、インスタンス内の設定は不要です。
詳細はこちら:インスタンスの利用可能な CloudWatch メトリクスのリスト表示

1-2.CloudWatchエージェントから収集可能なメトリクス

メモリの使用量やプロセスやポートの使用状況などは、OS内部からしか収集できません。
EC2インスタンスへインストールしたCloudWatch Agent経由で収集します。
詳細はこちら:CloudWatch エージェントにより収集されるメトリクス

1-3.LoadAverageはどうしたらいい?

LoadAverageはハイパーバイザーから収集できず、またCloudWatchエージェントからも収集できません。
何か別の手段を考える必要があります。

自作スクリプトで値を取得し、AWSのAPIにPutするという方法も考えられますが、なるべく書かない方向で考えました。

2.CloudWatchとcollectdを連携させる構成

上記の通り、CloudWatch AgentはLoadAverageを取得できません。
しかし、collectdというツールはLoadAverageを取得でき、CloudWatch Agentはcollectdから値を受け取ることができます。

全体的なアーキテクチャは下図の通りです。

参考:collectd を使用したカスタムメトリクスの取得

3.設定手順

3-1.collectdのインストール

まずは、collectdをインストールします。
先にCloudWatch Agentでcollectd連携の設定をしようとすると失敗するので、先にcollectdをインストールしましょう。

3-2. CloudWatchエージェントのインストール

はじめてのCloudWatch Agent導入 (SSM & CentOS)の手順でインストールします。

Amazon Linuxなどの場合は、SSM Agentはインストール済みなので、そこはスキップしましょう。
CloudWatch Agentのcollectdに関する設定を下記のように変更します。
ローカルホスト内でのCloudWatch Agentとcollectdの通信ですが、ユーザー名、パスワード、暗号化が必要になってます。

CloudWatch Agentでcollectdサーバ機能が有効になっていると、127.0.0.1:25826 でListenしているのが確認できるはずです。

3-3.collectdの設定

/etc/collectd.conf
collectdの設定ファイルです。
collectd.confは、大量の記載があるのですが、LoadAverageの収集だけなら、下記でいいと思います。
LoadAverageのためのloadプラグインと、CloudWatch Agentと通信するためのnetworkプラグインを有効化・設定しています。

/etc/collectd.d/auth_file
こちらの設定はCloudWatch Agentが読み取ります。
ユーザー名とパスワードがcollectd.confと一致している必要があります。

3-4.collectdの有効化・起動

上手くいくと、以下のような出力になります。

4.動作確認

CloudWatchの画面でLoadAverageの1分平均、5分平均、15分平均が収集できているのを確認できます。

AWS運用自動化サービス「Cloud Automator」