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

記事タイトルとURLをコピーする

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をインストールしましょう。

$ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum install -y collectd

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

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

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

    "metrics": {
        "metrics_collected": {
            "collectd": {
                "collectd_security_level":"encrypt",
                "collectd_auth_file":"/etc/collectd.d/auth_file",
                "metrics_aggregation_interval": 60
            },

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

$ sudo netstat -lanput | grep 25826
udp        0      0 127.0.0.1:25826         0.0.0.0:*                           3664/amazon-cloudwa

3-3.collectdの設定

/etc/collectd.conf

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

LoadPlugin load
LoadPlugin network

<Plugin load>
        ReportRelative true
</Plugin>

<Plugin network>
        <Server "127.0.0.1" "25826">
                SecurityLevel "Encrypt"
                Username "user"
                Password "secret"
        </Server>
</Plugin>

Include "/etc/collectd.d"

/etc/collectd.d/auth_file

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

user: secret

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

$ sudo systemctl enable collectd.service
$ sudo systemctl start collectd.service

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

$ sudo systemctl status collectd
● collectd.service - Collectd statistics daemon
   Loaded: loaded (/usr/lib/systemd/system/collectd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-03-30 04:13:02 UTC; 17s ago
     Docs: man:collectd(1)
           man:collectd.conf(5)
 Main PID: 1480 (collectd)
   CGroup: /system.slice/collectd.service
           └─1480 /usr/sbin/collectd

Mar 30 04:13:02 ip-10-200-10-211.ap-northeast-1.compute.internal systemd[1]: Starting Collectd statistics daemon...
Mar 30 04:13:02 ip-10-200-10-211.ap-northeast-1.compute.internal collectd[1480]: plugin_load: plugin "load" successfully loaded.
Mar 30 04:13:02 ip-10-200-10-211.ap-northeast-1.compute.internal collectd[1480]: plugin_load: plugin "network" successfully loaded.
Mar 30 04:13:02 ip-10-200-10-211.ap-northeast-1.compute.internal collectd[1480]: Systemd detected, trying to signal readyness.
Mar 30 04:13:02 ip-10-200-10-211.ap-northeast-1.compute.internal systemd[1]: Started Collectd statistics daemon.
Mar 30 04:13:02 ip-10-200-10-211.ap-northeast-1.compute.internal collectd[1480]: Initialization complete, entering read-loop.

4.動作確認

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

渡辺 信秀 (記事一覧)