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から値を受け取ることができます。
全体的なアーキテクチャは下図の通りです。
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分平均が収集できているのを確認できます。
渡辺 信秀(記事一覧)
2017年入社 / 地味な内容を丁寧に書きたい