CloudWatchでVyOSのカスタムメトリクスを取ってみた

2016.07.07

クラメソダー市田です。

最近、VyOSをよく利用するのですが、VyOSのカスタムメトリクスを取ることができないか検証してみたので、その方法をご紹介します。

取得方法

すぐに思いつく取得方法は次の2つかと思います。

  1. マニュアルの手順で取得

- Amazon EC2 Linux インスタンスのメモリとディスクのメトリックスのモニタリング 2. AWS CLIで取得

今回はAWS CLIで取得する方法をご紹介します。こちらの方が楽です。 マニュアル通りの方法で取得することも可能ですが、以下の理由から採用しませんでした。

  • 必要なPerlモジュールなどを入れないといけないが、Debian用パッケージが入るようにしないといけないとかつらい。
  • aws-cliで取った方が楽。

IAM Roleの準備

インスタンスを作成する前に、CloudWatchにデータをputできるようにポリシーを作成します。 今回は、下記の内容にしました。

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Hoot24PutMetricData",
"Effect": "Allow",
"Action": [
"cloudwatch:PutMetricData"
],
"Resource": [
"*"
]
}
]
}

AWS CLIインストール

IAMの準備ができたらMarketplaceからVyOSのAMIを選択して、vyosのインスタンスを起動させます。先ほど作成したIAM Roleの指定を忘れないようにします。

VyOSにはvyos@IPアドレスでログインします。

$ ssh -i <秘密鍵> vyos@<VyOSのIPアドレス>

ログインできたら、AWSのドキュメントにあるコマンドを実行します。

# インストールスクリプトのダウンロードと実行
vyos@VyOS-AMI:~$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
vyos@VyOS-AMI:~$ sudo python get-pip.py

# pipでAWS CLIをインストール
vyos@VyOS-AMI:~$ sudo pip install awscli

AWS CLI のインストールと設定

これで/usr/local/bin/awsにインストールできました。

vyos@VyOS-AMI:~$ which aws
/usr/local/bin/aws

カスタムメトリクス用のスクリプトの設置

今回は、下記のようなスクリプト(memoryUsage.sh)でメモリー使用量を取ってみます。

#!/bin/bash

log() {
echo $1 | logger -t cw-monitoring
}
usage=$(free | head -n 3 | tail -n 1 | awk '{a = $3/($3 + $4)*100; print a}')
instanceId=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
region=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//')

cw_opts="--namespace CustomMetrics/VyOS"
cw_opts=${cw_opts}" --metric-name MemoryUtilization"
cw_opts=${cw_opts}" --dimensions InstanceId=${instanceId}"
cw_opts=${cw_opts}" --unit Percent"
cw_opts=${cw_opts}" --region ${region}"
cw_opts=${cw_opts}" --value ${usage}"

# wait for 0 - 15 seconds to disperse API request.
sleep $(($RANDOM % 15))

counter=0
MAX_RETRY=3

while :; do
# Error Retry
/usr/local/bin/aws cloudwatch put-metric-data ${cw_opts}
if [ $? -ne 0 ]; then
if [ "${counter}" -ge "${MAX_RETRY}" ]; then
echo "failed"
exit 1
fi
else
break
fi

counter=$((counter + 1))
sleep 10
done

exit 0

このスクリプトをcw-monというユーザでcronで実行します。(ユーザ名は任意です。) まずはユーザを作成します。

vyos@VyOS-AMI:~$ sudo useradd cw-mon

次に、このスクリプトを適当な場所に設置します。 今回は、/opt/monitoring/memoryUsage.shにしました。

/opt/monitoringディレクトリは存在しないので作成します。

vyos@VyOS-AMI:~$ sudo mkdir /opt/monitoring

設置できたら権限とオーナーを修正します。

vyos@VyOS-AMI:~$ sudo chown cw-mon:cw-mon /opt/monitoring/memoryUsage.sh
vyos@VyOS-AMI:~$ sudo chmod 744 memoryUsage.sh

最後にcw-monユーザで先ほどのスクリプトをcronに登録します。 cw-monユーザにスイッチしてスクリプトを設置します。

vyos@VyOS-AMI:~$ sudo su cw-mon

なお、cronの編集エディタがデフォルトでnanoエディタですが、個人的に使いづらかったので、viに変更しています。

sh-4.1$ EDITOR=vi
sh-4.1$ export EDITOR

以下の内容でcronに登録します。

*/5 * * * * /opt/monitoring/memoryUsage.sh

これでCloudWatchを見ると、下記のように「CustomMetrics/VyOS」をプルダウンで選択できるようになっていると思います。 そこでメモリー利用量が取得できていれば成功です。

CloudWatcのグラフ

最後に

VyOSはDebianベースのソフトウェアルータなので簡単に取得できそうだなと思っていましたが、公式ドキュメントの内容でやろうとしてみると中々辛かったです。 今回の内容のようにVyOSでカスタムメトリクスを取るときは、AWS CLIで取得することをお勧めします。

以上になります。